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

1745

Как определить, является ли переменная 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 останавливает выполнение.

Показать ещё 1 комментарий
Теги:
variables
null
undefined

27 ответов

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

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

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

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

  • 2
    Я пытаюсь проверить, является ли событие пустым в Firefox, и ошибка блокирует выполнение: «событие не определено»
  • 0
    Можете ли вы поделиться разделом кода, который ошибается? Используйте ссылку для вставки.
Показать ещё 2 комментария
932

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

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

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

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

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


Изменить снова

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

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

  • 42
    Это вызовет ReferenceError и прервет выполнение, если переменная не определена или вообще не указана в коде, использование typeof более безопасно.
  • 44
    Это скорее стилистический момент. Если переменная не объявлена вообще, что это на самом деле просто плохо письменной форме со стороны автора. Вы должны знать, была ли объявлена ваша переменная или нет, это не должно быть вопросом. Но да , если по какой-то причине это так, это должно быть изменено на window.variable, а не просто на переменную , что не приведет к ошибке ссылки. Typeof следует избегать.
Показать ещё 22 комментария
176

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

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

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

  • 2
    @Aerovistae Я понимаю, что typeof - это оператор, а не функция, поэтому ему не нужны круглые скобки, но, тем не менее, я ценю круглые скобки - просто для ясности чтения.
  • 1
    как насчет прямой проверки if (variable === undefined) вместо использования typeof?
Показать ещё 4 комментария
171
if (variable == null) {
    // Do stuff, will only match null or undefined, this won't match false
}
  • 14
    На всякий случай, если кто-то думает, что это еще один полу-ответ, это на самом деле работает. undefined оценивает равно null .
  • 3
    Не удалось мне в консоли chrome ... ReferenceError: переменная не определена, поэтому она может работать, но не для меня ...
Показать ещё 9 комментариев
77
if (typeof EmpName != 'undefined' && EmpName) {

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

  • ноль

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

  • NaN

  • пустая строка ("")

  • 0

  • ложный

  • 11
    Я думаю, что это опасная техника, которая распространяется как дикий огонь. Потому что многие проверяемые переменные могут быть логическими или числовыми. Так что, если пользователь не до конца понимает последствия, это не хорошо.
  • 0
    Пожалуйста, предоставьте ссылку на эту спецификацию javascript
Показать ещё 7 комментариев
21
Функция

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

Итак, вы можете протестировать пустую строку. Альтернативно, поскольку пустые строки, null и undefined являются false-y, вы можете просто сделать это:

if (!EmpName) { //do something }
  • 1
    Chrome 17.0.963.78 m выдает эту ошибку: ReferenceError: EmpName is not defined
  • 6
    @EranMedan Я знаю, что уже поздно, но, надеюсь, это поможет людям, которые придут сюда позже. Причина, по которой вы получаете ошибку, заключается в том, что она вообще не была объявлена. Обычно вам нужно, чтобы EmpName (или некоторая другая переменная) передавалась в функцию, или возвращалось значение другой функции и, следовательно, объявлялось (Пример: "var x;"). Чтобы проверить, вернул ли он значение undefined, или null, или пустую строку, вы можете использовать вышеуказанное решение.
Показать ещё 1 комментарий
11

Мне нравится использовать это:

if (!!variable) {
   //do something
}

Он ловит как null, так и undefined

9

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

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

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

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

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

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

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

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

Я пришел написать свою собственную функцию для этого. 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 считаются непустыми.

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

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

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;
  • 0
    Это не сработало для меня. Я все еще получил ошибку: ReferenceError: s is not defined для первого примера.
  • 0
    Это не работает с number
Показать ещё 1 комментарий
4

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

if (object) { Somecode}

то есть.

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

Элемент проверки jQuery не равен null

var dvElement = $('#dvElement');

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

С приведенным ниже решением:

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...

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

  • ноль
  • не определено
  • NaN
  • пустой
  • string ("")
  • 0
  • ложный
  • 0
    Это не отвечает на вопрос, который является "как я могу поймать ноль и неопределенный?" а не "как мне поймать каждое значение фальси в JavaScript?"
  • 0
    @Aerovistae, я думал, что сделал с console.log (isDeepEqual (null, null)); и console.log (isDeepEqual (не определено, не определено)); ?
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')
}
  • 2
    Что произойдет, если пользователь введет слово «неопределенный»?
  • 0
    Ваш вопрос хороший, он показывает, что условие истинно, поэтому нам нужно изменить опцию normal undefined на условие typeof. @Chuck
Показать ещё 2 комментария
1

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

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

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

Я запускаю этот тест на консоли хром, используя (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
0

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

В результате, и потому, что быстрее писать, я привык использовать ярлык для undefined который должен смотреть на первое значение пустого массива. Это значение гарантируется как undefined значение примитива, и к нему можно получить доступ с помощью [][0].

Эта проверка будет работать для поиска как undefined и null.

Вот пример:

(function(undefined){
    var foo = { baz: null };
    console.log(foo.bar === undefined); //false
    console.log(foo.bar == [][0]); //true
    console.log(foo.baz == [][0]); //true
}(50))
0

Я вижу, что исходный пост использовал JQuery. Поэтому я добавляю то, что я использовал в прошлом через JQuery. Обычно, когда я выполняю такую проверку, я не обязательно проверяю, чтобы значение было null или undefined только для этой цели. Больше похоже на "Значение там, поэтому я могу выполнять действия над ним". Поэтому для этого я использую следующее. Я не пробовал каждый тип, но я знаю, что он работает как для null, так и для undefined. Кроме того, объекты и массивы (пустая версия этих объектов вернет true). Кроме того, конечно, если переменная не существует, вы получите исключение, но я честно стараюсь избежать этого любой ценой. Поэтому я согласен с Aerovistae. Я хочу знать об этом в своем коде и не хочу просто пропустить его.

if ($.trim(value) != '') {
   //Do Something
}
0
(null == undefined)  // true

(null === undefined) // false

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

0

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

if(typeof value == 'undefined'){
  • 0
    См. Комментарии в предыдущем ответе ( stackoverflow.com/a/21273362/6305294 ) относительно typeof.
  • 2
    Это неверно Не ловит null . Я не понимаю, почему новые, неправильные ответы даются на вопрос, на который давали правильный и полный ответ много лет назад. Считаете ли вы, что текущие ответы как-то недостаточны?
0

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

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
}
  • 0
    Можете ли вы объяснить, почему вы считаете, что это «лучший / безопасный способ» для проведения тестов?
  • 0
    Поскольку преобразование всегда возвращает «стандартизированную» строку (т. Е. [Объект Undefined]), поэтому вы не столкнетесь с проблемами, протестировав ложные значения. Это только мое мнение, основанное на опыте, который я имел с правдивыми / ложными ценностями.
Показать ещё 2 комментария
-1
var x;
if (x === undefined) {
    alert ("only declared, but not defined.")
};
if (typeof y === "undefined") {
    alert ("not even declared.")
};

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

-1

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

-2

Вы можете проверить это на method-

if(['object','undefined'].indexOf(typeof(variable)) != -1){
    console.log("variable is null or undefined.");
}
-2

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

    if(sVal === '' || sVal === null ||typeof sVal === 'undefined'){
    console.log('variable is undefined or null');
    }
  • 0
    Закрыть, но нет. Потеряйте typeof и сравните с undefined сразу, а не в виде строки. Это работает, но дополнительный оператор не имеет никакого эффекта, кроме как сделать его более многословным.
  • 0
    В этом случае да, вы правы, нам не нужно использовать typeof. Но хорошей практикой является использование typeof, когда вы имеете дело с неопределенными переменными. Одной из причин использования typeof является то, что он не выдает ошибку, если переменная не была объявлена.
Показать ещё 2 комментария
-2

Мой вклад в 5 центов за конкретный случай:

var bUndef = ($('#' + selectedNodeID).position() === undefined)
if (bUndef)
....

Свойство не определено не элементом!

-3

if(x==null) - плохая идея в javascript, судья с "==" может вызвать непредвиденное принуждение типа и не может быть прочитан кофе script,   никогда не использовать "==" или "! =" при условии суждения!

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

Изображение 2101

https://www.w3schools.com/js/js_best_practices.asp

  • 3
    Это совершенно неверно, и поверхностное изучение любой профессиональной платформы или программного обеспечения подтвердит это в считанные минуты. Использование == для сравнения с null является стандартным способом ловли null и undefined в JS. Приведение типов с помощью == не является риском в этом конкретном контексте, и фактически используется для достижения цели одновременного undefined как null и undefined . Пожалуйста, уделите больше времени работе с языком, прежде чем предлагать неправильные и вводящие в заблуждение ответы на вопросы, которые были удовлетворительно решены много лет назад.
  • 0
    избегать "==". Все постоянно меняется, я не согласен с тобой @Aerovistae
Показать ещё 1 комментарий

Ещё вопросы

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