Как я могу определить, является ли переменная «неопределенной» или «нулевой»?


2131

Как определить, является ли переменная undefinedили null?

Мой код выглядит следующим образом:

var EmpName = $("div#esd-names div#name").attr('class');
if(EmpName == 'undefined'){
  // DO SOMETHING
};
<div id="esd-names">
  <div id="name"></div>
</div>

Но если я сделаю это, интерпретатор JavaScript останавливает выполнение.


Ответы:


2851

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

if (variable == null){
    // your code here.
}

Потому что null == undefinedэто правда, приведенный выше код будет ловить оба nullи undefined.


5
Я пытаюсь проверить, является ли событие пустым в Firefox, и ошибка блокирует выполнение: «событие не определено»
Entretoize

3
@MichaelFever Как это не работает? Скопируйте и вставьте это в свою консоль: const y = undefined; y == null;оно должно вернутьсяtrue
Сераф

2
@ChrisStryczynski Например, из вашего комментария вы объявили yконстанту, но вы сравниваете abc(не y). Когда я тестировал yчерез console.log(y == null);Chrome и Firefox, я получил trueрезультат. Если вы получили ошибку, то, возможно, вы попытались использовать оператор присваивания =вместо сравнения, ==что имело бы смысл возвращать ошибку, поскольку constне может быть переназначено.
Пшемо

2
живой пример соответствующих сравнений. LGTM.
Райан

2
@ZaytsevDmitry, почему вы ожидаете тест, если переменная равна nullили undefinedпройдет, если переменная равна 0? Вопрос не в проверке истинного значения, а в явном тестировании для nullили undefined.
Родриго-Силвейра

1108

Стандартный способ поймать nullи undefinedодновременно это:

if (variable == null) {
     // do something 
}

- который на 100% эквивалентен более явному, но менее лаконичному:

if (variable === undefined || variable === null) {
     // do something 
}

При написании профессиональных JS считается само собой разумеющимся, что равенство типов и поведение ==vs=== понятны. Поэтому мы используем ==и сравниваем только с null.


Редактировать снова

Комментарии, предлагающие использование typeofпросто ошибочны. Да, мое решение выше вызовет ReferenceError, если переменная не существует. Это хорошая вещь. Эта ReferenceError желательна: она поможет вам найти свои ошибки и исправить их до того, как вы отправите свой код, точно так же, как ошибки компилятора в других языках. Используйте try/, catchесли вы работаете с вводом, который вы не можете контролировать.

В вашем коде не должно быть ссылок на необъявленные переменные.


47
Это вызовет ReferenceError и прервет выполнение, если переменная не определена или вообще не указана в коде, использование typeof более безопасно.
Мани Гандхам

56
Это скорее стилистический момент. Если переменная не была объявлена на все , что на самом деле просто плохо письменной форме со стороны автора. Вы должны знать, была ли объявлена ​​ваша переменная или нет, это не должно быть вопросом. Но да , если по какой-то причине это так, это следует изменить на window.variable, а не просто на переменную , что не приведет к ошибке ссылки. Typeof следует избегать.
временное_имя_пользователя

6
Да потому что ты написал !==вместо !=.
временное_имя_пользователя

9
-OP: утверждение о том, что эти сравнения "эквивалентны 100%", ПРОСТО НЕПРАВИЛЬНО, как вы отметили в своем EDIT, второе вызовет ReferenceError. Что касается утверждения: «В вашем коде не должно быть ссылок на необъявленные переменные». ДЕЙСТВИТЕЛЬНО? Вы когда-нибудь слышали о дополнительных параметрах? jsfiddle.net/3xnbxfsu
Тимоти Кански

16
Необязательные параметры @TimothyKanski могут быть неопределенными, если они необязательно не указаны, но они наиболее определенно объявлены как переменные. Они объявлены и имеют значение undefined, как любая объявленная, но неинициализированная переменная, т. var someVar;
Е.

228

Объединяя вышеприведенные ответы, представляется, что наиболее полным ответом будет:

if( typeof variable === 'undefined' || variable === null ){
    // Do stuff
}

Это должно работать для любой переменной, которая либо необъявлена, либо объявлена, и для нее явно установлено значение null или undefined. Булево выражение должно иметь значение false для любой объявленной переменной, которая имеет фактическое ненулевое значение.


2
@Aerovistae Я понимаю, что typeofэто оператор, а не функция, поэтому ему не нужны скобки, но я все же ценю скобки - просто для ясности чтения.
user664833

1
а как насчет прямой проверки if (variable === undefined) вместо использования typeof?
Мороженая

2
@ArjunU, который вызовет ReferenceError, если переменная не объявлена. Если вы не знаете, объявлена ​​ли переменная, используйте вышеуказанное решение. Если вы можете гарантировать, что переменная хотя бы объявлена, вы можете использоватьvariable == null
Rogue

3
Это лучшее решение, потому что, как указывал @Rogue, переменная не может быть объявлена.
Абдул Садик Ялчин

Поправьте меня, если я ошибаюсь, но не является ли первое условное надмножеством второго, и, следовательно, второе условное лишнее?
Март Хо

187
if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}

14
На всякий случай, если кто-то думает, что это еще один полу-ответ, это действительно работает. undefinedоценивается равным null.
Чак

3
Не удалось мне в консоли Chrome ... ReferenceError: переменная не определена, поэтому она может работать, но не для меня ...
Эран Медан

48
Он работает только для объявленных переменных, а не для переменных, которые могут или не могут быть объявлены, что редко имеет место. (Вы должны использовать typeof + пустую проверку для этого случая)

11
Только что подумал, что вы можете добавить этот комментарий: /*jshint eqnull:true */в начало вашего документа или функции JS, и JSHint перестанет предупреждать вас о вашем использовании == null.
Web_Designer

3
@Aerovistae можете ли вы указать мне ссылку, которая явно заявляет, что она не ==работает. Принуждение if(variable == null)в этом ответе имеет для меня полный смысл ...
Бен Астон

94
if (typeof EmpName != 'undefined' && EmpName) {

будет иметь значение true, если значение не равно:

  • значение NULL

  • не определено

  • NaN

  • пустой строкой ("")

  • 0

  • ложный


13
Я думаю, что это опасная техника, которая распространяется как дикий огонь. Потому что многие проверяемые переменные могут быть логическими или числовыми. Так что, если пользователь не полностью понимает последствия, это не хорошо.
полезноBee

Пожалуйста, предоставьте ссылку на эту спецификацию javascript
villamejia

1
Это так же, как if (EmpName). Если это уже undefinedбудет обманом.
Руди

1
Если переменная не определена. тогда если (EmpName) выдаст ошибку
Thamaraiselvam

1
@Thamaraiselvam Я думаю, что Руди, возможно, имел в виду это var EmpName; if (EmpName). Где переменная определена, но ей не присвоено значение.
голодовка

28

attr()Функция jQuery возвращает либо пустую строку, либо фактическое значение (и никогда nullили undefined). Единственный раз, когда он возвращает undefined, когда ваш селектор не вернул ни одного элемента.

Таким образом, вы можете проверить на пустую строку. В качестве альтернативы, поскольку пустые строки, null и undefined имеют значение false-y, вы можете просто сделать это:

if (!EmpName) { //do something }

1
Chrome 17.0.963.78 m выдает эту ошибку:ReferenceError: EmpName is not defined
Eran Medan

6
@EranMedan Я знаю, что уже поздно, но, надеюсь, это поможет людям, которые придут сюда позже. Причина, по которой вы получаете ошибку, заключается в том, что она вообще не была объявлена. Обычно вам нужно, чтобы EmpName (или некоторая другая переменная) передавались в функцию, или возвращалось значение другой функции и, следовательно, объявлялось (Пример: "var x;"). Чтобы проверить, вернул ли он значение undefined, или null, или пустую строку, вы можете использовать вышеуказанное решение.
Дейв

Я понимаю, что это холодный вопрос, но jQuery вернется, undefinedесли атрибут не существует в элементе (а не только в том случае, если селектор не имеет совпадающих элементов согласно ответу). Например, « imgбез» srcбудет возвращаться undefinedдля$('img').attr('src');
codinghands

20

Я пришел написать свою собственную функцию для этого. JavaScript странный.

Это применимо буквально на что угодно. (Обратите внимание, что это также проверяет, содержит ли переменная какие-либо используемые значения . Но так как эта информация обычно также необходима, я думаю, что это стоит опубликовать). Пожалуйста, рассмотрите возможность оставить записку.

function empty(v) {
    let type = typeof v;
    if (type === 'undefined') {
        return true;
    }
    if (type === 'boolean') {
        return !v;
    }
    if (v === null) {
        return true;
    }
    if (v === undefined) {
        return true;
    }
    if (v instanceof Array) {
        if (v.length < 1) {
            return true;
        }
    } else if (type === 'string') {
        if (v.length < 1) {
            return true;
        }
        if (v === '0') {
            return true;
        }
    } else if (type === 'object') {
        if (Object.keys(v).length < 1) {
            return true;
        }
    } else if (type === 'number') {
        if (v === 0) {
            return true;
        }
    }
    return false;
}

Машинопись-совместимый.


Эта функция должна делать точно то же самое , как в PHP empty()функции (см RETURN VALUES)

Считает undefined, null, false, 0, 0.0, "0" {}, []как пустые.

"0.0", NaN, " ", trueСчитаются не пусто.


2
Я столкнулся с небольшой проблемой проверки нуля. Я хочу проверить, является ли передаваемый параметр пустым или пустым объектом { }. Это распространенная и глупая языковая проблема, но я забыл об этом. Во всех моих поисках отображаются ответы на неопределенное значение NULL или сравнение с отсутствующим равенством (==), но нет строгого равенства (===) или аналога. И вот здесь, в вашем рейтинге с рейтингом -1 в самом низу страницы (до того, как я проголосовал), есть ответ, который ускользнул от меня. Object.keys( obj ).length < 1или, может быть, === 0, при условии, что это никогда не будет -1. Во всяком случае, проголосовал за 0, Ву. : p

Спасибо, я смог добавить эту функцию и очистить много кода. Почему это не стандартная функция JS - вне меня.
Энди

3
Вы должны изменить все из ваших , ==чтобы ===здесь, то это было бы разумно функция.
Бен Макинтайр

13

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

if (window.yourVarName) {
    // Your code here
}

Этот способ проверки не выдаст ошибку, даже если yourVarNameпеременная не существует.

Пример: я хочу знать, поддерживает ли мой браузер History API

if (window.history) {
    history.back();
}

Как это работает:

windowявляется объектом, который содержит все глобальные переменные в качестве своих свойств, и в JavaScript допустимо пытаться получить доступ к несуществующему свойству объекта. Если historyне существует, то window.historyвозвращается undefined. undefinedявляется ложным, поэтому код в if(undefined){}блоке не будет работать.


2
Читатели должны заметить, что подобный подход идиоматичен для проверки - из JavaScript, запущенного в браузере - была ли объявлена глобальная переменная, и особенно, доступна ли предоставляемая браузером глобальная переменная (например, API истории). Он не будет работать для проверки, является ли неглобальная переменная nullили undefined, и не будет работать, если ваш JavaScript работает вне браузера (то есть в Node.js). Он также будет относиться к глобальным переменным, установленным на 0, falseили ''таким же, как и для необъявленных глобальных undefinedили null, что обычно нормально.
Марк Эмери

Это предполагает, что скрипт работает в браузере. Это не дано.
GreenAsJade

13

Самый короткий и простой:

if(!EmpName ){
 // DO SOMETHING
}

это оценит как true, если EmpName:

  • значение NULL
  • не определено
  • NaN
  • опорожнить
  • строка ("")
  • 0
  • ложный

3
В данном случае я хочу узнать разницу между неопределенным и ложным. Я буду использовать проверку на ноль тогда.
gast128

12

Вероятно, самый короткий способ сделать это:

if(EmpName == null) { /* DO SOMETHING */ };

Вот доказательство:

А вот более подробная информация о ==(источник здесь )

Введите описание изображения здесь

БОНУС : причина, почему ===яснее ==(см. Ответ agc )

Введите описание изображения здесь


9

У меня только что была эта проблема, т.е. проверка, является ли объект нулевым.
Я просто использую это:

if (object) {
    // Your code
}

Например:

if (document.getElementById("enterJob")) {
    document.getElementById("enterJob").className += ' current';
}

3
было бы лучше установить var A = document.getElementById ("enterJob") if (A) A.className + = 'current'; таким образом, вы делаете 50% работы для того же результата ... Но, возможно, вы просто сделали это для шоу, а затем я приветствую.
Гарри Свенссон

8

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

var s; // undefined
jQuery.isEmptyObject(s); // will return true;

s = null; // defined as null
jQuery.isEmptyObject(s); // will return true;

// usage
if(jQuery.isEmptyObject(s)){
    alert('Either variable: s is undefined or its value is null');
}else{
     alert('variable: s has value ' + s);
}

s = 'something'; // defined with some value
jQuery.isEmptyObject(s); // will return false;

Это не сработало для меня. Я все еще получил ошибку: ReferenceError: s is not definedдля первого примера.
Марк

6

Элемент проверки jQuery не нулевой:

var dvElement = $('#dvElement');

if (dvElement.length  > 0) {
    // Do something
}
else{
    // Else do something else
}

5

В JavaScript, насколько мне известно, мы можем проверить неопределенную, нулевую или пустую переменную, как показано ниже.

if (variable === undefined){
}

if (variable === null){
}

if (variable === ''){
}

Проверьте все условия:

if(variable === undefined || variable === null || variable === ''){
}

varэто зарезервированное слово, это броситSyntaxError
dhilt

5

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

if (x === null || x === undefined) {
 // Add your response code here, etc.
}

4

Самый простой способ проверить это:

if(!variable) {
  // If the variable is null or undefined then execution of code will enter here.
}

1
Это выполнит код, если переменная имеет значение false, которое потенциально нежелательно.
byxor

Вопрос ясен: «Как определить, является ли переменная« неопределенной »или« нулевой »?» и в javascript, если переменная имеет значение null или undefined, ее значение равно false.
М. Арнольд

1
Извините, но это неверно. Вот JSfiddle, чтобы доказать это.
byxor

Судя по вашему ответу, undefined, null и несколько других вещей , как пустая строка, +0, -0 NaNи falseполучить. !оператор заставляет операнд здесь variable- к булеву: ecma-international.org/ecma-262/#sec-toboolean
Алиреза

Но проверьте вопрос: «Как определить, является ли переменная неопределенной или нулевой»,! Операнд, используемый с if, всегда будет возвращать значение true, если переменная равна нулю или не определена.
М. Арнольд

3

С решением ниже:

const getType = (val) => typeof val === 'undefined' || !val ? null : typeof val;
const isDeepEqual = (a, b) => getType(a) === getType(b);

console.log(isDeepEqual(1, 1)); // true
console.log(isDeepEqual(null, null)); // true
console.log(isDeepEqual([], [])); // true
console.log(isDeepEqual(1, "1")); // false
etc...

Я могу проверить следующее:

  • значение NULL
  • не определено
  • NaN
  • опорожнить
  • строка ("")
  • 0
  • ложный

Это не отвечает на вопрос, который является "как я могу поймать ноль и неопределенный?" а не "как мне поймать каждое значение фальси в JavaScript?"
temporary_user_name

@Aerovistae, я думал, что сделал с console.log (isDeepEqual (null, null)); и console.log (isDeepEqual (не определено, не определено)); ?
Тони Тай Нгуен

2

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

    if(typeof sVal === 'undefined' || sVal === null || sVal === ''){
      console.log('variable is undefined or null');
    }

Закрыть, но нет. Потерять typeofи сравнить undefinedпрямо, а не как строку. Это работает, но дополнительный оператор не имеет никакого эффекта, кроме как сделать его более многословным.
временное_имя_пользователя

В этом случае да, вы правы, нам не нужно использовать typeof. Но хорошей практикой является использование typeof, когда вы имеете дело с неопределенными переменными. Одной из причин использования typeof является то, что он не выдает ошибку, если переменная не была объявлена.
DanKodi

Это на самом деле плохо. Вам не нужны необъявленные переменные в вашем коде. Вы хотите, чтобы выбрасывало ReferenceError, чтобы вы могли найти переменную и объявить ее. Конечно, вы бы не попробовали это на скомпилированном языке, таком как C ++! То, что JS позволяет это, не означает, что это должно быть сделано.
временное_пользовательское имя

1
Ваше или утверждение обратное. Проверка того, что что-то не определено, будет первым шагом, а не вторым.
Энтони Ратледж

2

Я запускаю этот тест в консоли Chrome. Используя (void 0) вы можете проверить undefined:

var c;
undefined
if (c === void 0) alert();
// output =  undefined
var c = 1;
// output =  undefined
if (c === void 0) alert();
// output =   undefined
// check c value  c
// output =  1
if (c === void 0) alert();
// output =  undefined
c = undefined;
// output =  undefined
if (c === void 0) alert();
// output =   undefined

2

Давайте посмотрим на это,

  1.  

    let apple; // Only declare the variable as apple
    alert(apple); // undefined

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

  2.  

       let apple = null; /* Declare the variable as apple and initialized but the value is null */
       alert(apple); // null

Во втором он отображает ноль, потому что переменная appleзначения равна нулю.

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

if(apple !== undefined || apple !== null) {
    // Can use variable without any error
}

1

Лучший способ:

if(typeof variable==='undefined' || variable===null) {

/* do your stuff */
}

6
Это точное решение уже было предоставлено @jkindwall 11 октября 2013 года. Stackoverflow.com/a/19323555/2943403 Этот пост, содержащий только код, совершенно бесполезен, поскольку он не добавляет никакой новой ценности странице. Фактически, это добавляет раздувание страницы и тратит время исследователей на его чтение. Пожалуйста, удалите этот ответ.
mickmackusa


1
var i;

if (i === null || typeof i === 'undefined') {
    console.log(i, 'i is undefined or null')
}
else {
    console.log(i, 'i has some value')
}

3
Что произойдет, если пользователь введет слово «неопределенный»?
Чак

Ваш вопрос хороший, он показывает, что условие истинно, поэтому нам нужно изменить опцию normal undefined на условие typeof. @Chuck
KARTHIKEYAN.A

Это не верно. typeofникогда не уступит undefined, только строка 'undefined'. Более того, i == nullуже верно, если iесть undefined, поэтому второй логический тип будет избыточным, даже если он сработает.
temporary_user_name

1
Это решение (с перевернутыми условиями) уже было предоставлено @jkindwall 11 октября 2013 года. Stackoverflow.com/a/19323555/2943403 Этот пост, содержащий только код, совершенно бесполезен, поскольку не добавляет нового значения на страницу. Фактически, это добавляет раздувание страницы и тратит время исследователей на его чтение. Пожалуйста, удалите этот ответ.
mickmackusa

1

foo == nullЧек должен сделать трюк и решить «неопределенный или нулевой» случай в кратчайшему. (Не учитывая случай «foo не объявлен».) Но люди, которые привыкли иметь 3 равных (как лучшая практика), могут не принять это. Просто посмотрите на правила eqeqeq или triple-equals в eslint и tslint ...

Явный подход, когда мы проверяем, является ли переменная undefinedили nullотдельно, должен применяться в этом случае, и мой вклад в тему (27 неотрицательных ответов на данный момент!) Заключается в использовании void 0как короткого, так и безопасного способа выполнения проверки для undefined.

Использование foo === undefinedнебезопасно, поскольку undefined не является зарезервированным словом и может быть скрыт ( MDN ). Использование typeof === 'undefined'check безопасно, но если мы не собираемся заботиться о случае foo-is-undeclared, можно использовать следующий подход:

if (foo === void 0 || foo === null) { ... }

1

если вы создаете функцию для проверки:

export function isEmpty (v) {
 if (typeof v === "undefined") {
   return true;
 }
 if (v === null) {
   return true;
 }
 if (typeof v === "object" && Object.keys(v).length === 0) {
   return true;
 }

 if (Array.isArray(v) && v.length === 0) {
   return true;
 }

 if (typeof v === "string" && v.trim().length === 0) {
   return true;
 }

return false;
}

-1

Вызов typeof null возвращает значение «object», поскольку специальное значение null считается пустой ссылкой на объект. Safari до версии 5 и Chrome до версии 7 имеют причуду, при которой вызов typeof для регулярного выражения возвращает «функцию», в то время как все другие браузеры возвращают «объект».


-1
var x;
if (x === undefined) {
    alert ("only declared, but not defined.")
};
if (typeof y === "undefined") {
    alert ("not even declared.")
};

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


-1

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

var EmpName = $("div#esd-names div#name").attr('class');

// Undefined check
if (Object.prototype.toString.call(EmpName) === '[object Undefined]'){
    // Do something with your code
}

// Nullcheck
if (Object.prototype.toString.call(EmpName) === '[object Null]'){
    // Do something with your code
}

Можете ли вы объяснить, почему вы считаете, что это «лучший / безопасный способ» для проведения тестов?
sadmicrowave

Поскольку преобразование всегда возвращает «стандартизированную» строку (т. Е. [Объект Undefined]), поэтому вы не столкнетесь с проблемами, протестировав ложные значения. Это только мое мнение, основанное на опыте, который я имел с правдивыми / ложными ценностями.
n1kkou

Спасибо за объяснение. Я не критикую, это интересный ответ, я просто хотел, чтобы вы предоставили некоторые объяснения другим, почему это потенциально лучше других методов.
sadmicrowave

Не беспокойся! У меня было много проблем с этим типом сравнений, и до сих пор я считаю это наиболее полезным подходом к этому вопросу.
n1kkou

-2

Вы можете проверить, является ли значение неопределенным или нулевым, просто используя typeof:

if(typeof value == 'undefined'){

См. Комментарии в предыдущем ответе ( stackoverflow.com/a/21273362/6305294 ) относительно typeof.
Алекс

4
Это неверно Не ловит null. Я не понимаю, почему новые, неправильные ответы даются на вопрос, на который был дан правильный и полный ответ много лет назад. Считаете ли вы, что текущие ответы как-то недостаточны?
temporary_user_name

-4

if(x==null)плохая идея в JavaScript. Судите по "=="- это может вызвать неожиданное приведение типов, и оно не может быть прочитано CoffeeScript, никогда не используйте "==" или "! =" При оценке условий!

if(x)будет лучше, но будьте осторожны с 0 и "" . Это будет рассматриваться как ложный , а не равный метод с "!= null"это верно .

Введите описание изображения здесь

См. Лучшие практики JavaScript .


3
Это совершенно неверно, и поверхностное изучение любой профессиональной платформы или программного обеспечения подтвердит это в считанные минуты. Используя ==для сравнения , чтобы nullэто стандартный способ ловли и в JS. Приведение типов с помощью не является риском в этом конкретном контексте, и фактически используется для достижения цели отлова одновременно и одновременно. Пожалуйста, уделите больше времени работе с языком, прежде чем предлагать неправильные и вводящие в заблуждение ответы на вопросы, которые были удовлетворительно решены много лет назад. nullundefined==nullundefined
temporary_user_name

избегать "==". Все постоянно меняется, я не согласен с тобой @Aerovistae
Albert.Qing

3
Вы не согласны со мной - вы не согласны со всем созданием JavaScript. Давайте будем ясны.
временное_пользовательское имя
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.