Питання Як визначити, чи є змінна "невизначеною" чи "нульовою"?


Як визначити, чи є змінна 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 зупинить виконання.


1609
2018-04-15 18:12


походження


Чи можемо ми призначити це запитання для блокування? Я не маю достатньої репутації. @ tats_innit - Aerovistae
@Aerovistae лише модератор діаманта <> може вручну блокувати та розблокувати стовпчикпоточного повідомлення: meta.stackexchange.com/questions/22228/...  :) - Tats_innit


Відповіді:


Ви можете використовувати якості абстрактний оператор рівності зробити це:

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

Оскільки null == undefined це правда, вищезгаданий код зловить обидва null і undefined.


2200
2018-04-15 18:14



if (typeof variable === 'undefined' || !variable) { /* do things */ }; це працює для мене - Ansd
@ Закрийте ваше рішення не виключно undefined або null. !variable Буде справедливо для будь-якого фальшивого значення: '', 0, false, null, undefinedі т. д. - Douglas Ludlow
Чи є які-небудь пояснення, чому працює '==', а '===' ні? Я подивився на тему редагування в мета, але я не розумію, чому ця відповідь не могла б отримати вигоду від пояснення того, чому '==' тут використовується і як це працює. - LucyMarieJ
Я відповів на власне запитання. Вибачте. Я знайшов відповідь тут: stackoverflow.com/questions/5101948/...  Для тих, хто має таку ж плутанину. - LucyMarieJ
Чи є який-небудь старий браузер, де це може вийти з ладу? - donquixote


Стандартний спосіб спіймати null і undefined одночасно це:

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

- яка на 100% еквівалентна більш явним, але менш лаконічним:

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

Під час написання професійного JS вважається само собою зрозумілим, що [тип рівності та поведінки == проти ===] [1] розуміється. Тому ми використовуємо == і тільки порівнювати з null.


Редагувати знову

Коментарі, що пропонують використовувати typeof просто неправильно Так, моє рішення вище призведе до ReferenceError, якщо змінна не існує. Це добре. Це ReferenceError бажано: це допоможе вам знайти вашу помилку та виправити його, перш ніж відправити ваш код, так само, як і помилки компілятора на інших мовах.

У коді не повинно бути ніяких посилань на незадекларовані змінні.


911
2018-01-22 03:01



Це спричинить виконання ReferenceError та break, якщо змінна не визначена або взагалі відсутня в коді, використовуючи typeof безпечніше. - Mani Gandham
Це більше стилістичної точки. Якщо змінна не була оголошена в все, це насправді просто погане написання з боку автора. Ви повинні знати, чи була ваша змінна оголошена чи ні, це не повинно стати питанням. Але так, якщо для чомусь це так, це слід змінити на window.variable замість просто змінна, що не спричинить еталонну помилку. Типof слід уникати. - Aerovistae
Так, тому що ти написав !== замість !=. - Aerovistae
-OP: твердження про те, що ці порівняння є "100% еквівалентом", є просто неправильним, як ви помітили у своєму власному EDIT, другий викличе ReferenceError. Що стосується твердження: "У коді не повинно бути ніяких посилань на незадекларовані змінні". ДІЙСНО? Ви коли-небудь чули про додаткові параметри? jsfiddle.net/3xnbxfsu - Timothy Kanski
Параметри @TimothyKanski можуть бути невизначеними, якщо вони необов'язково не надаються, але вони найбільш точно визначені змінні. Вони оголошені і мають значення undefined, як і будь-яка заявлена, але не ініціалізована змінна, тобто var someVar; так що ваш аргумент насправді не затримується - chiliNUT


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

176
2018-04-15 18:25



Тільки у випадку, якщо хтось думає, що це ще одна половина відповіді, це насправді працює. undefined оцінює дорівнює null. - Chuck
Помилка в моїй консолі Chrome ... ReferenceError: змінна не визначена, тому вона може працювати, але не для мене ... - Eran Medan
Він працює тільки для оголошених змінних, а не змінних, які можуть бути оголошені або не можуть бути оголошені, що рідко відбувається. (Вам потрібно використовувати typeof + нульову перевірку для цього випадку)
Просто з'ясували ви можете додати цей коментар: /*jshint eqnull:true */ до вершини вашого документа JS або функції, і JSHint перестане попереджати вас про використання == null. - Web_Designer
@Aerovistae ви можете вказати мені на посилання, яке чітко зазначає це == зламаний. Примусово if(variable == null)в цій відповіді мені повний сенс ... - Ben


Поєднуючи наведені вище відповіді, здається, найбільш повною відповіддю буде:

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

Це має працювати для будь-якої змінної, яка незареєстрована або оголошена, і явно встановлена ​​як нульова або невизначена. Логічний вираз повинен оцінювати false для будь-якої оголошеної змінної, яка має фактичне не нульове значення.


162
2017-10-11 17:02



@Aerovistae я це визнаю typeof це оператор, а не функція, тому вона не потребує дужок, але я ціную круглу думку, тим не менш, просто для чіткості читання. - user664833
як щодо перевірки, чи (змінна === undefined) замість використання typeof? - Arjun U.
@ArjunU, що викликає ReferenceError, якщо змінну не оголошено. Якщо ви не знаєте про те, чи оголошена змінна, використовуйте вказане вище рішення. Якщо ви можете гарантувати, що змінна вказана як мінімум, ви можете використовувати її variable == null - Rogue
Це краще рішення, оскільки, як зазначив @Rogue, змінна може не бути оголошена. - Abdul Sadik Yalcin
Виправляти мене, якщо я помиляюся, але чи не перший умовний суперсет другий, і тому другий умовний зайвий? - March Ho


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

оцінить значення true, якщо значення не є:

  • нуль

  • невизначено

  • NaN

  • порожня рядок ("")

  • 0

  • помилковий


75
2018-05-07 07:24



Я думаю, це небезпечна техніка, яка поширилася як дикий вогонь. Тому що багато змінних, які перевіряються, можуть бути логічними чи цифрами. Отже, якщо користувач не повністю розуміє наслідки, це не добре. - usefulBee
Будь ласка, надайте посилання на цю специфікацію для JavaScript - villamejia
Це те ж саме, що і if (EmpName). Якщо це так undefined буде фальш вже. - Rudy
Якщо змінна не визначена. тоді якщо (EmpName) викине помилка - Thamaraiselvam
@Thamaraiselvam Я думаю, що Руді, можливо, мав на увазі це var EmpName; if (EmpName). Де змінна визначена, але не призначено значення. - hungerstar


jQuery attr() Функція повертає або порожній рядок, або фактичне значення (і ніколи null або undefined) Єдиний раз, коли він повертається undefined коли ваш селектор не повернув жодного елемента.

Тому ви можете перевірити чистий рядок. Крім того, оскільки пусті рядки, нульові та невизначені, є false-y, ви можете просто зробити це:

if (!EmpName) { //do something }

20
2018-04-15 18:20



Chrome 17.0.963.78 m дає цю помилку: ReferenceError: EmpName is not defined - Eran Medan
@EranMedan Я знаю, що це пізно, але це, сподіваюся, допоможе людям, які прийдуть сюди пізніше. Причиною помилки є те, що воно не було оголошено взагалі. Зазвичай ви можете використовувати EmpName (або іншу змінну) у функцію або повернути значення іншої функції, і тому оголосити (Приклад: "var x;"). Щоб перевірити, чи він повернув невизначену чи нульову чи порожню рядок, ви можете скористатися вказаним вище рішенням. - Dave


Мені подобається використовувати це:

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

Це ловить обидва нуль і невизначено


13
2017-09-16 08:35



!! повертає false для null або undefined. Таким чином, це буде виконуватися тільки якщо змінна не є нульовою або невизначеною. - Dan
var d = 0; буде невдач, як !!d оцінює до помилковості - ainesophaur
Це також "ловить" порожню рядок 0, NaN, і false. Повністю неправильна відповідь. - Aerovistae
Вниз, оскільки ця відповідь - отруєння пулу знань StackOverflow. - mickmackusa


Якщо змінна, яку ви хочете перевірити, є глобальною, робіть

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

Цей спосіб перевірки не буде викидати помилку, навіть якщо yourVarName змінної не існує.

Приклад. Я хочу знати, чи підтримує мій браузер API історії

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

Як це працює:

window це об'єкт, який містить всі глобальні змінні як його властивості, і в JavaScript це законно, щоб спробувати отримати доступ до неіснуючого властивості об'єкта. Якщо history тоді не існує window.history повертає undefined. undefined це помилково, так що код в if(undefined){} блок не буде працювати.


9
2018-02-10 16:30



Читачі повинні помітити, що такий підхід є ідіоматичним для перевірки - від JavaScript, що виконується в браузері, - чи є це глобальний була оголошена змінна, і особливо, чи доступний глобальний браузер (як-от API історії). Це не буде працювати для перевірки, чи є не глобальна змінна null або undefined, і це не спрацює, якщо ваш JavaScript працює за межами веб-переглядача (тобто в Node.js). Також буде розглянуто глобали, встановлені на 0, false або '' такі ж, як і ті, які не є оголошеною або undefined або null, що зазвичай добре. - Mark Amery
Це передбачає, що сценарій працює в браузері. Це не дано. - GreenAsJade


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


7
2017-10-24 15:14



Я зіткнувся з проблемою нульової перевірки. Я хочу перевірити, чи є переданий параметр null чи порожній об'єкт { }. Це загальна і нерозумна проблема мови, але я про це забув. Всі мої пошуки показують відповіді на невизначеність нульового значення або порівняння рівних рівнів (==), але не суворе рівність (===) або еквівалент. І тут, у вашому рейтинговому рейтингу -1 дуже дно сторінки (до того, як я отримав відповідь) - це відповідь, яка мене відвернула. Object.keys( obj ).length < 1 або, можливо, === 0, припускаючи, що ніколи не буде -1. У будь-якому разі, прирівнюється до 0, ну. : р - user314159
Спасибі, я зміг випустити цю функцію і очистити багато коду. Чому це не стандартна функція JS перевершує мене. - Andy
Ви повинні змінити все вашої == до === тут, то це було б розумною функцією. - Ben McIntyre
@BenMcIntyre ти маєш рацію. Дякую. - Blauhirn