Существует ли стандартная функция для проверки нулевых, неопределенных или пустых переменных в JavaScript?

1648

Существует ли универсальная функция JavaScript, которая проверяет, что переменная имеет значение и гарантирует, что она не undefined или null? У меня есть этот код, но я не уверен, что он охватывает все случаи:

function isEmpty(val){
    return (val === undefined || val == null || val.length <= 0) ? true : false;
}
  • 5
    Возможный дубликат Как вы проверяете наличие пустой строки в JavaScript?
  • 0
    Я сделал скрипку для тестирования: jsfiddle.net/J7m7m/886
Показать ещё 7 комментариев
Теги:
null
undefined

31 ответ

3683
Лучший ответ

Вы можете просто проверить, имеет ли переменная значение truthy или нет. Это означает

if( value ) {
}

будет оцениваться до true, если value не:

  • NULL
  • undefined
  • NaN
  • пустая строка ("")
  • 0
  • ложь

В приведенном выше списке представлены все возможные значения falsy в ECMA-/Javascript. Найдите его в спецификации в разделе ToBoolean.

Кроме того, если вы не знаете, существует ли переменная (это означает, что если она была объявлена), вы должны проверить ее с помощью оператора typeof. Например,

if( typeof foo !== 'undefined' ) {
    // foo could get resolved and it defined
}

Если вы можете быть уверены, что переменная объявлена ​​по крайней мере, вы должны прямо проверить, имеет ли она значение truthy, как показано выше.

Далее читайте: http://typeofnan.blogspot.com/2011/01/typeof-is-fast.html

  • 70
    Что, если значение является ложным логическим значением, которое было предназначено. Иногда вы хотите задать значение по умолчанию, если значение отсутствует, что не сработает, если было передано ложное логическое значение.
  • 80
    @ TruMan1: в таком случае (когда ваша логика требует проверки) вы должны действовать как if( value || value === false ) . То же самое относится ко всем ложным значениям , мы должны проверить их явно.
Показать ещё 27 комментариев
172

Подробный метод проверки того, является ли значение неопределенным или null:

return value === undefined || value === null;

Вы также можете использовать оператор == но это позволяет узнать все правила:

return value == null; // also returns true if value is undefined
  • 30
    Проверка только на null или undefined может быть выполнена следующим образом: if (value == null) . Имейте в виду оператор == который принуждает. Если вы проверите вот так, if (value === null || value === undefined) , вы забыли / не знаете, как работает Javascript. webreflection.blogspot.nl/2010/10/...
  • 27
    @ChristiaanWesterbeek: ваша точка зрения, что arg == null дает те же результаты, что и arg === undefined || arg === null . Тем не менее, я считаю последний пример более читабельным.
Показать ещё 8 комментариев
63
function isEmpty(value){
  return (value == null || value.length === 0);
}

Это вернет true для

undefined  // Because undefined == null

null

[]

""

и функции нулевого аргумента, так как функция length - это количество объявленных параметров, которое требуется.

Чтобы запретить последнюю категорию, вы можете просто проверить пустые строки

function isEmpty(value){
  return (value == null || value === '');
}
  • 5
    undefined == null но undefined !== null
  • 2
    @IanBoyd, потому что вы сравниваете == с ===. это означает, что undefined == null (true) undefined! = null (false) undefined === null (false) undefined! == null (true) было бы лучше дать немного больше информации, чтобы быть полезным и подтолкнуть людей в правильном направлении. Мож док о разнице developer.mozilla.org/en-US/docs/Web/JavaScript/…
Показать ещё 3 комментария
28

Я знаю, что это старый вопрос, но это самый безопасный чек, и я не видел его здесь точно так:

if (typeof value != 'undefined' && value) {
    //deal with value'
};

Он будет охватывать случаи, когда значение никогда не было определено, а также любое из них:

  • NULL
  • undefined (значение undefined не совпадает с параметром, который никогда не определялся)
  • 0
  • "" (пустая строка)
  • ложь
  • NaN

P.S. нет необходимости строгого равенства в typeof value!= 'undefined'

  • 9
    Я не отрицал, но что касается строгого сравнения на равенство, общее правило таково, что если вам не нужно неявное преобразование типов, следует использовать строгое сравнение.
  • 2
    Спасибо за ваш комментарий Стив. Это общее правило просто отлично. Я просто ожидаю, что люди поймут, почему они используют один или другой. Каждый раз, как вы выглядите, ppl будет рад проповедовать вам о том, что «всегда всегда используйте строгий» - как будто это самая важная вещь в Javascript. Я видел слишком много случаев, таких как if (val! == null), которые явно приводят к нежелательному результату. Приятно сказать, что когда сомневаешься - пользуйся строгим, но лучше не сомневаться.
Показать ещё 2 комментария
26

Вы можете найти следующую полезную функцию:

function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}

Или в ES7 (прокомментируйте, если последующие улучшения)

function typeOf(obj) {
  const { toString } = Object.prototype;
  const stringified = obj::toString();
  const type = stringified.split(' ')[1].slice(0, -1);

  return type.toLowerCase();
}

Результаты:

typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/) //regexp
typeOf(new Date()) //date
typeOf(new WeakMap()) //weakmap
typeOf(new Map()) //map

"Обратите внимание, что оператор связывания (: :) не является частью ES2016 (ES7) или какой-либо более поздней версии стандарта ECMAScript вообще. В настоящее время это предложение этапа (strawman) для введения в язык". - Симон Кьелберг. автор хочет добавить свою поддержку этому прекрасному предложению получить королевское вознесение.

  • 0
    +1 полезно знать объект типа 'regexp' , 'array' и 'function'
  • 0
    @ Vix, почему версия ES7 лучше?
Показать ещё 2 комментария
26

Первый ответ с лучшим рейтингом неверен. Если значение undefined, это вызовет исключение в современных браузерах. Вы должны использовать:

if (typeof(value) !== "undefined" && value)

или

if (typeof value  !== "undefined" && value)
  • 3
    э-э-э ... я думаю, что это неправильно, как будто (значение) достаточно (за исключением пустых объектов / массивов). если значение равно «undefined», признание «if» не пройдет.
  • 2
    Это объединяет переменные, которые не определены (которые генерируют ReferenceError при оценке), которые отличаются от переменных с undefined значением.
Показать ещё 3 комментария
16

! проверьте пустые строки (""), null, undefined, false и число 0 и NaN. Скажем, если строка пуста var name = "", то console.log(!name) возвращает true.

function isEmpty(val){
  return !val;
}

эта функция вернет true, если val пустой, null, undefined, false, число 0 или NaN.

  • 0
    Это на самом деле не говорит, является ли переменная пустой, поскольку false и 0 могут быть допустимыми значениями и не представлять собой пустое значение. Ценность наличия функции isEmpty состояла бы в том, чтобы гарантировать, что ожидаемые значения, которые являются пустыми, возвращают true. по моему мнению, null, undefined, NaN и пустая строка являются значениями, которые имеют смысл как пустые.
  • 5
    Зачем использовать isEmpty(val) если вы можете просто сделать !val ?
Показать ещё 1 комментарий
11

Вы немного переусердствовали. Чтобы проверить, не указана ли переменной значение, вам нужно будет проверить только undefined и null.

function isEmpty(value){
    return (typeof value === "undefined" || value === null);
}

Это предполагает 0, "", а объекты (даже пустой объект и массив) являются допустимыми "значениями".

  • 2
    Проверка только на null или undefined может быть выполнена следующим образом: if (value == null) . Имейте в виду оператор == который принуждает. Если вы проверите вот так, if (value === null || value === undefined) , вы забыли / не знаете, как работает Javascript. webreflection.blogspot.nl/2010/10/...
9

Здесь my - возвращает true, если значение равно null, undefined и т.д. или пустое (т.е. содержит только пробелы):

function stringIsEmpty(value) {

    return value ? value.trim().length == 0 : true;

}
7

Если вы предпочитаете простой javascript, попробуйте это:

  /**
   * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
   * length of `0` and objects with no own enumerable properties are considered
   * "empty".
   *
   * @static
   * @memberOf _
   * @category Objects
   * @param {Array|Object|string} value The value to inspect.
   * @returns {boolean} Returns `true` if the `value` is empty, else `false`.
   * @example
   *
   * _.isEmpty([1, 2, 3]);
   * // => false
   *
   * _.isEmpty([]);
   * // => true
   *
   * _.isEmpty({});
   * // => true
   *
   * _.isEmpty('');
   * // => true
   */

function isEmpty(value) {
    if (!value) {
      return true;
    }
    if (isArray(value) || isString(value)) {
      return !value.length;
    }
    for (var key in value) {
      if (hasOwnProperty.call(value, key)) {
        return false;
      }
    }
    return true;
  }

В противном случае, если вы уже используете подчеркивание или lodash, попробуйте:

_.isEmpty(value)
  • 2
    Попробовал ваш код. Я получаю сообщение об ошибке в консоли, которое гласит: «Ошибка необработанной ссылки: isArray () не определен». В противном случае было бы здорово, если бы это работало.
  • 10
    По крайней мере, в случае с lodash, _.isNil - это функция, которую вы ищете, а не _.isEmpty . Документация isNil, документация isEmpty
Показать ещё 3 комментария
6

Это условие проверки

if (!!foo) {
    //foo is defined
}

- это все, что вам нужно.

  • 0
    Я предполагаю, что это всего лишь фрагмент. Но if уже делает ложную проверку, которая просто конвертируется в логическое значение. Отлавливает ли он какие-либо случаи, которые нормальный if(foo) не заразил?
  • 0
    Это идеально подходит для случаев, когда вам нужно что-то встроенное, например, мне нужен атрибут реагирования (называемый активным), который имеет значение true, когда строка не пустая - оператор if будет излишним, поэтому я могу просто использовать active={!!foo}
5

Это очень простой.

if(data) {
  //Comes inside only if the data is not empty and not null 
}
  • 2
    Этот ответ неверен, потому что он терпит неудачу, если data === false . ОП хочет проверить наличие нулевых, неопределенных или объектов, которые имеют свойство длины <= 0. false является ни одной из этих вещей.
  • 1
    @ Пол, это не правда. Ответ jAndy, получивший большое количество голосов, такой же, и он объясняет, как много вещей могут быть признаны ложными.
Показать ещё 2 комментария
4

Это может быть полезно.

[null, undefined, ''].indexOf(document.DocumentNumberLabel) > -1
  • 2
    не могли бы вы объяснить, пожалуйста. то, что там происходит
  • 0
    Массив содержит некоторую переменную, которую вы приняли за пустую.
4

Чтобы проверить значение по умолчанию

function typeOfVar (obj) {
      return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}
function isVariableHaveDefaltVal(variable) {
    if ( typeof(variable) === 'string' ) {  // number, boolean, string, object 
        console.log(' Any data Between single/double Quotes is treated as String ');        
        return (variable.trim().length === 0) ? true : false;
    }else if ( typeof(variable) === 'boolean' ) {
      console.log('boolean value with default value \'false\'');
        return (variable === false) ? true : false;
    }else if ( typeof(variable) === 'undefined' ) {
        console.log('EX: var a; variable is created, but has the default value of undefined.'); 
        return true;
    }else if ( typeof(variable) === 'number' ) { 
        console.log('number : '+variable);
        return (variable === 0 ) ? true : false;
    }else if ( typeof(variable) === 'object' ) {
   //   -----Object-----
        if (typeOfVar(variable) === 'array' && variable.length === 0) {
            console.log('\t Object Array with length = ' + [].length); // Object.keys(variable)
            return true;
        }else if (typeOfVar(variable) === 'string' && variable.length === 0 ) {
            console.log('\t Object String with length = ' + variable.length);
            return true;
        }else if (typeOfVar(variable) === 'boolean' ) {
            console.log('\t Object Boolean = ' + variable);
            return (variable === false) ? true : false;
        }else if (typeOfVar(variable) === 'number' ) {
            console.log('\t Object Number = ' + variable);
            return (variable === 0 ) ? true : false;
        }else if (typeOfVar(variable) === 'regexp' && variable.source.trim().length === 0 ) {
       console.log('\t Object Regular Expression : ');
        return true;
        }else if (variable === null) {
       console.log('\t Object null value');
        return true;
        }
    }
    return false;
}
var str = "A Basket For Every Occasion";
str = str.replace(/\s/g, "-");
//The "g" flag in the regex will cause all spaces to get replaced.

проверить Результат:

isVariableHaveDefaltVal(' '); // string          
isVariableHaveDefaltVal(false); // boolean       
var a;           
isVariableHaveDefaltVal(a);               
isVariableHaveDefaltVal(0); // number             
isVariableHaveDefaltVal(parseInt('')); // NAN isNAN(' '); - true         
isVariableHaveDefaltVal(null);              
isVariableHaveDefaltVal([]);               
isVariableHaveDefaltVal(/ /);              
isVariableHaveDefaltVal(new Object(''));               
isVariableHaveDefaltVal(new Object(false));            
isVariableHaveDefaltVal(new Object(0)); 
typeOfVar( function() {} );

Я использовал функцию @Vix(), чтобы проверить объект этого типа.

используя instansof "

var prototypes_or_Literals = function (obj) {
    switch (typeof(obj)) {
        // object prototypes
        case 'object':
            if (obj instanceof Array)
                return '[object Array]';
            else if (obj instanceof Date)
                return '[object Date]';
            else if (obj instanceof RegExp)
                return '[object regexp]';
            else if (obj instanceof String)
                return '[object String]';
            else if (obj instanceof Number)
                return '[object Number]';

            else
                return 'object';
        // object literals
        default:
            return typeof(obj);
    }   
};
output test «
prototypes_or_Literals( '' ) // "string"
prototypes_or_Literals( new String('') ) // "[object String]"
Object.prototype.toString.call("foo bar") //"[object String]"        
  • 0
    Операторы сравнения проверяют == [Данные]. === [Данные, тип объекта] Числа JS всегда хранятся как числа с плавающей запятой двойной точности, в соответствии с международным стандартом IEEE 754. // Number Type [int, float literals ] var int = 77; var float = 77.7; console.log( int.toFixed(10) + '\t' + float.toFixed(10) ); // Object Type var number = new Number( 77 ); if( int != float ) console.log('Data Not Equal'); if( int == number && int !== number ) console.log('Data is Equal & Types vary');
4

вы можете использовать:

Если условие, чтобы проверить, не является ли строка или значение пустой. например:

if (someVar.value) 
{
  //its not emppty
}
else
{
  //Its empty
}
  • 0
    Если вы не определили его отдельно, ни один нативный объект JS не имеет свойства value .
4

Если переменная не была объявлена, вы не сможете проверить для undefined функцию, потому что вы получите сообщение об ошибке.

if (foo) {}
function (bar) {}(foo)

Оба будут генерировать ошибку, если foo не был объявлен.

Если вы хотите проверить, была ли указана переменная, вы можете использовать

typeof foo != "undefined"

если вы хотите проверить, объявлено ли foo и имеет значение, которое вы можете использовать

if (typeof foo != "undefined" && foo) {
    //code here
}
3

Если вы используете TypeScript и не хотите учитывать "значения, которые являются false ", то это решение для вас:

Во-первых: import { isNullOrUndefined } from 'util';

Затем: isNullOrUndefined(this.yourVariableName)

Обратите внимание: как упоминалось ниже, это теперь устарело, используйте value === undefined || value === null value === undefined || value === null. ref.

  • 0
    Я думал, что это круто, поэтому я изначально не голосовал, но это вещь Node.js, которая устарела. Файл определений типов гласит: /** @deprecated since v4.0.0 - use "value === null || value === undefined" instead. */
  • 0
    @atomictom Я думал, что это typescript вещь. Можете ли вы предоставить ссылку на его документацию?
Показать ещё 1 комментарий
3

Вы можете использовать следующий код для проверки всех четырех (4) условий для проверки, таких как не null, не пустые, не неопределенные и не ноль, только используйте этот код (! (! (Variable))) в javascript и jquery.

function myFunction() {
    var data;  //The Values can be like as null, blank, undefined, zero you can test

    if(!(!(data)))
    {
        alert("data "+data);
    } 
    else 
    {
        alert("data is "+data);
    }
}
2
return val || 'Handle empty variable'

это действительно хороший и чистый способ справиться с этим во многих местах, также может использоваться для назначения переменных

const res = val || 'default value'
  • 0
    Много мест , но не тогда , когда по умолчанию является true , и вы пытаетесь поставить или вернуть val из false .
  • 0
    @Molomby - это очень специфический крайний случай, но даже это легко обрабатывается const res = falsyValue ? true : falsyValue
2
function isEmpty(obj) {
    if (typeof obj == 'number') return false;
    else if (typeof obj == 'string') return obj.length == 0;
    else if (Array.isArray(obj)) return obj.length == 0;
    else if (typeof obj == 'object') return obj == null || Object.keys(obj).length == 0;
    else if (typeof obj == 'boolean') return false;
    else return !obj;
}

В ES6 с отделкой для обработки строк с пробелами:

const isEmpty = value => {
    if (typeof value === 'number') return false
    else if (typeof value === 'string') return value.trim().length === 0
    else if (Array.isArray(value)) return value.length === 0
    else if (typeof value === 'object') return value == null || Object.keys(value).length === 0
    else if (typeof value === 'boolean') return false
    else return !value
}
  • 1
    отличная функция, спасибо! обрабатывает каждый тип значения - числа опущены во всех других решениях!
  • 1
    @FabianvonEllerts Пожалуйста, не пытайтесь редактировать дополнительный код в ответе другого человека. Опубликуйте его как собственный ответ, как комментарий к ответу или попросите в комментарии, чтобы они сами обновили ответ.
2

Для всех, кто приехал сюда за аналогичным вопросом, следующие работы великолепны, и у меня есть это в моей библиотеке последние годы:

(function(g3, $, window, document, undefined){
   g3.utils = g3.utils || {};
/********************************Function type()********************************
* Returns a lowercase string representation of an object constructor.
* @module {g3.utils}
* @function {g3.utils.type}
* @public
* @param {Type} 'obj' is any type native, host or custom.
* @return {String} Returns a lowercase string representing the object 
* constructor which is different from word 'object' if they are not custom.
* @reference http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/
* http://stackoverflow.com/questions/3215046/differentiating-between-arrays-and-hashes-in-javascript
* http://javascript.info/tutorial/type-detection
*******************************************************************************/
g3.utils.type = function (obj){
   if(obj === null)
      return 'null';
   else if(typeof obj === 'undefined')
      return 'undefined';
   return Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1].toLowerCase();
};
}(window.g3 = window.g3 || {}, jQuery, window, document));
1
var myNewValue = myObject && myObject.child && myObject.child.myValue;

Это никогда не вызовет ошибку. Если myObject, child или myValue равно null, myNewValue будет null. Ошибок не будет.

1
function isEmpty(val){
    return !val;
}

но это решение чрезмерно спроектировано, если вы не хотите изменять функцию позже для потребностей модели на машинах, тогда чище использовать ее непосредственно в коде:

if(!val)...
1

Это проверит, является ли переменная неопределенной вложенности undefined

function Undef(str) 
{
  var ary = str.split('.');
  var w = window;
  for (i in ary) {
    try      { if (typeof(w = w[ary[i]]) === "undefined") return true; }
    catch(e) { return true; }
  }
  return false;
}

if (!Undef("google.translate.TranslateElement")) {

Вышеописанная проверка, существует ли функция перевода Google TranslateElement. Это эквивалентно:

if (!(typeof google === "undefined" 
 || typeof google.translate === "undefined" 
 || typeof google.translate.TranslateElement === "undefined")) {
0

Я оставлю зарегистрированное решение, которое мне очень понравилось:

Сначала давайте определим, что пустая переменная равна null или undefined, или, если она имеет длину, равна нулю, или если это объект, у нее нет ключей:

function isEmpty (value) {
  return (
    // null or undefined
    (value == null) ||

    // has length and it zero
    (value.hasOwnProperty('length') && value.length === 0) ||

    // is an Object and has no keys
    (value.constructor === Object && Object.keys(value).length === 0)
  )
}

Возвращает:

  • true: undefined, null, "", [], {}
  • false: true, false, 1, 0, -1, "foo", [1, 2, 3], { foo: 1 }
  • 0
    Отличное решение, спасибо!
0
try{

     let vari = obj.propTest; // obj may be don't have propTest property

        ...
} catch(NullException){
    // do something here
}

Я думаю, что использование try catch позволит избежать ошибки null check, также в Angular или JavaScript. Просто улавливает нулевое исключение и обрабатывает его.

  • 1
    Возможно, будет еще полезнее включить объяснение того, что делает ваш код и почему он отвечает на вопрос. Размещение только кода иногда может быть неясным.
  • 0
    Вы должны добавить объяснение, чтобы оправдать свой ответ.
Показать ещё 1 комментарий
0

Хотя старое, что забыли, что они должны обернуть свой блок кода, а затем поймать ошибку, а затем проверить...

function checkup( t ){
  try{
    for(p in t){
      if( p.hasOwnProperty( t ) ){
        return true;
      }
    }
    return false;
  }catch(e){
    console.log("ERROR : "+e);
    return e;
  }
}

Поэтому вам действительно не нужно проверять потенциальную проблему перед рукой, вы просто ее поймаете, а затем справляетесь с ней, как хотите.

0

Я думаю, используя? оператор немного чист.

var ? function_if_exists() : function_if_doesnt_exist();
-1

Вы можете напрямую использовать оператор равенства

<script>
    var firstName;
    var lastName = null;
    /* Since null == undefined is true, the following statements will catch both null and undefined */
        if(firstName == null){
            alert('Variable "firstName" is undefined.');
        }    
        if(lastName == null){
           alert('Variable "lastName" is null.');
        }
</script>

demo @Как определить, является ли переменная неопределенной или null с использованием JavaScript

-2

Эта функция проверяет empty object {}, empty array [], null, undefined и blank string ""

function isEmpty(val) {
  //check for empty object {}, array []
  if (val !== null && typeof val === 'object') {
    if (Object.keys(obj).length === 0) {
      return true;
    }
  }
  //check for undefined, null and "" 
  else if (val == null || val === "") {
    return true;
  }
  return false;
}

var val = {};
isEmpty (val) → true
Val = [];
isEmpty (val) → true
isEmpty (undefined) → true
isEmpty (null) → true
isEmpty ("") → true
isEmpty (false) → false
isEmpty (0) → false

-2

В моем случае я попытался использовать переменную null, '',!, но это не сработало.

Смотрите мой код ниже, чтобы получить текст из поля html

var status=$(this).text(); //for example (for my case)

если в переменной состояния не было значения (без текста), я пытался установить значение "novalue" в переменную статуса.

работал следующий код.

if(status == false)
{
   status='novalue';
} 

когда не было найдено текста для переменной satus, указанный выше код присваивал "novalue" переменной состояния

  • 0
    действительно хотел бы знать, почему это получает отрицательные отзывы? это было бы действительно полезно. Если вы отрицаете, пожалуйста, объясните, почему вы считаете этот ответ неправильным.
  • 0
    Я думаю, что это не очень ответ на вопрос. Вы объясняете проблему, которая у вас была, но кто-то другой уже давно нашел хорошее решение этого вопроса, прежде чем вы на него ответили.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню