Перевірка JavaScript на предмет null vs. undefined та різниці між == та ===


579
  1. Як перевірити змінну , якщо вона nullабо undefinedі те , що різниця між nullі undefined?

  2. У чому різниця між ==і ===(важко шукати в Google "===")?


10
2. Різниця між ==і ===тут добре описана .
Узбекйон

1. Використовуйте === Замість == JavaScript використовує два різні види операторів рівності: === | ! == і == | ! = Найкращою практикою вважається завжди використовувати колишній набір при порівнянні. "Якщо два операнди мають один і той же тип і значення, то === видає true і! == видає false." - JavaScript: Хороші частини. Однак, працюючи з == і! =, У вас виникнуть проблеми при роботі з різними типами. У цих випадках вони будуть намагатися примусити значення, безуспішно. code.tutsplus.com/tutorials/…
jasonleonhard

4
Ви можете шукати в Google: "оператор суворої рівності" - це дає дуже важливі результати
Danield

Просто для додання тут безлічі відповідей, що ви можете скористатися функцією lodash.com/docs#isNil, щоб перевірити, чи є змінною нульовою чи невизначеною
Кфір Ерез

Відповіді:


936

Як перевірити змінну , якщо це nullабо undefined...

Чи є змінною null:

if (a === null)
// or
if (a == null) // but see note below

... але зауважте, що останнє також буде правдивим, якщо aє undefined.

Це undefined:

if (typeof a === "undefined")
// or
if (a === undefined)
// or
if (a == undefined) // but see note below

... але ще раз зауважте, що останній розпливчастий; це також буде правдою, якщо aє null.

Тепер, незважаючи на вищезазначене, звичайний спосіб перевірити їх - використовувати той факт, що вони фальсифікують :

if (!a) {
    // `a` is falsey, which includes `undefined` and `null`
    // (and `""`, and `0`, and `NaN`, and [of course] `false`)
}

Це визначено ToBoolean у специфікації.

... і в чому різниця між nullі undefined?

Вони обидва значення зазвичай використовуються для позначення відсутності чогось. undefinedє більш загальним, використовуваним як значення за замовчуванням змінних, поки їм не буде призначено якесь інше значення, як значення аргументів функції, які не були надані під час виклику функції, і як значення, яке ви отримуєте, коли запитуєте об'єкт для власності, якої він не має. Але він також може бути явно використаний у всіх цих ситуаціях. (Існує різниця між об'єктом, який не має властивості, і властивістю зі значенням undefined; є різниця між викликом функції зі значеннямundefined для аргументу та цілком відключеним аргументом.)

nullдещо конкретніше, ніж undefined: Це пустий посилання на об'єкт. Звичайно, JavaScript вводиться неважливо, але не всі речі, з якими JavaScript взаємодіє, є набраними. Якщо такий API, як DOM у браузерах, потребує порожньої посилання на об'єкт, ми використовуємо null, не undefined. Аналогічно, getElementByIdоперація DOM повертає посилання на об'єкт - чи дійсну (якщо вона знайшла елемент DOM), або null(якщо вона не була).

Цікаво (чи ні), що вони є власними типами. Що означає, nullце єдине значення типу Null і undefinedє єдиним значенням у типі Undefined.

Яка різниця між "==" та "==="

Єдина відмінність між ними полягає в тому, що ==буде вводити примус, щоб спробувати зрівняти значення, а ===не буде. Так, наприклад "1" == 1, правда, тому що "1"примушує до1 . Але "1" === 1це помилково , оскільки типи не відповідають. ( "1" !== 1вірно.) Першим (реальним) кроком ===є "Чи типи операндів однакові?" і якщо відповідь "ні", результат є false. Якщо типи однакові, він робить саме те, що== робить.

Типовий примус використовує досить складні правила і може мати дивовижні результати (наприклад, "" == 0 це правда).

Детальніше в специфікації:


122
Для перегонки відповіді TJ === означає значення AND тип однаковий.
Невдаха

13
@Slappy: :-) @ MUG4N: Так, саме так. if (a) { ... }означатиме "якщо aє truthy", де "truthy" - значення, яке не є нулем, не має значення, не визначається, не відповідає помилці, не містить порожнього рядка. :-)
TJ Crowder

4
Гм ... чи хотів би співавтор поділитися корисними відгуками щодо того, чому ви вважаєте, що це "не корисно" (цитувати підказку кнопки знищення)?
TJ Crowder

2
@ Željko: Я думаю, що Крокфорд може помилитися з цього приводу. Це правда, що nullце не об'єкт , це посилання на об'єкт, що означає "немає об'єкта". Це важливо, адже це те, що використовується з наданими хостом інтерфейсами, коли вони надають посилання на об'єкти, але не мають їх надати (наприклад, node.nextSiblingколи nodeостанній елемент у його батьківському або getElementByIdколи немає елемента з цим ідентифікатором). Технологія, яку хост використовує для цього, може бути не такою гнучкою, оскільки JavaScript стосується типів змінних / властивостей, тому потрібно було мати nullref-ref (на відміну від undefined).
TJ Crowder

2
Я повинен погодитися, що Крокфорд помиляється. typeof nullповернення "об'єкта" має сенс. Єдине інше значення, яке мало б сенс, було б "null", оскільки воно, безумовно, повинно повернути щось інше від typeof undefined. null являє собою посилання на null об'єкт, що, принаймні, означає, що змінна, утримує його, призначена для певного типу "об'єкта". Якщо це була помилка, то це була гарна помилка. У будь-якому випадку, стосовно відповіді, підказку про undefined! == undefinedпід час перехресних сценаріїв добре знати, особливо для налагодження.
Трайко

93

Різниця тонка.

У JavaScript undefinedзмінна - це змінна, яка як ніколи не була оголошена або ніколи не присвоювала значення. Скажімо, ви заявляєте, var a;наприклад, тоді aбудеundefined , тому що ніколи не було призначено жодного значення.

Але якщо потім призначити, a = null;то aтепер буде null. У JavaScript null- об’єкт (спробуйте typeof nullв консолі JavaScript, якщо ви мені не вірите), це означає, що null - це значення (насправді навітьundefined це значення).

Приклад:

var a;
typeof a;     # => "undefined"

a = null;
typeof null;  # => "object"

Це може виявитися корисним у аргументах функцій. Ви можете мати значення за замовчуванням, але вважати нуль прийнятним. У такому випадку ви можете:

function doSomething(first, second, optional) {
    if (typeof optional === "undefined") {
        optional = "three";
    }
    // do something
}

Якщо ви опустите optionalпараметр, doSomething(1, 2) thenнеобов’язковим буде "three"рядок, але якщо ви перейдете, doSomething(1, 2, null)то необов'язковим будеnull .

Що стосується рівних ==і строго рівних ===компараторів, то перший - слабкого типу, тоді як строго рівний також перевіряє тип значень. Це означає, що 0 == "0"повернеться правдою; поки 0 === "0"поверне помилкове значення, оскільки число не є рядком.

Ви можете використовувати ці оператори , щоб перевірити між . Наприклад:undefinednull

null === null            # => true
undefined === undefined  # => true
undefined === null       # => false
undefined == null        # => true

Останній випадок цікавий тим, що дозволяє перевірити, чи змінна або не визначена, або нульова, і нічого іншого:

function test(val) {
    return val == null;
}
test(null);       # => true
test(undefined);  # => true

1
Кайл Сімпсон стверджує, що typeof null return "object" - помилка: github.com/getify/You-Dont-Know-JS/blob/master/…
bzrk

15

Специфікація - це місце, де можна отримати повні відповіді на ці питання. Ось підсумок:

  1. Для змінної xможна:

    • перевірити, чи це nullшляхом прямого порівняння, використовуючи=== . Приклад:x === null
    • перевірте, чи це undefinedза допомогою двох основних методів: прямого порівняння з undefinedабо typeof. З різних причин я віддаю перевагуtypeof x === "undefined" .
    • перевірте, чи це одне, nullі undefined, використовуючи ==та покладаючись на злегка таємні правила примусу, які означають, x == nullробить саме те, що ви хочете.

  2. Основна відмінність ==і ===полягає в тому, що якщо операнди різного типу, ===вони завжди повернуться, falseтоді як ==перетворять один або обидва операнди в один і той же тип, використовуючи правила, що призводять до деякої трохи неінтуїтивної поведінки. Якщо операнди одного типу (наприклад, обидва є рядками, такими як у typeofпорівнянні вище), ==і ===будуть вести себе абсолютно однаково.

Більше читання:


9

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

просто перевірте, чи має змінна дійсне значення, як це:

if(variable)

він повернеться істинним, якщо змінна не містить:

  • нуль
  • невизначений
  • 0
  • помилковий
  • "" (порожній рядок)
  • NaN

8

невизначений

Це означає, що змінна ще не використовується.

Приклад:

var x;
if(x){ //you can check like this
   //code.
}

дорівнює (==)

Це лише контрольне значення дорівнює не типу даних.

Приклад:

var x = true;
var y = new Boolean(true);
x == y ; //returns true

Тому що він перевіряє лише значення.

Строгі рівні (===)

Перевірки значення та типу даних повинні бути однаковими.

Приклад:

var x = true;
var y = new Boolean(true);
x===y; //returns false.

Оскільки він перевіряє тип даних x - примітивний тип, y - бульний об'єкт.


4

Оголошення 1. nullне є ідентифікатором властивості глобального об'єкта, як undefined може бути

Оголошення 2. ===Контрольні значення та типи. До ==порівняння (використання .valueOf()та .toString()) не потрібно вимагати однакових типів і здійснювати неявну конверсію . Тут у вас є всі ( src ):

якщо

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

== (його заперечення ! = )

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

=== (його заперечення ! == )

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


1
варто згадати це document.all == nullіdocument.all !== null
користувач

1

Якщо ваша (логічна) перевірка має заперечення (!), І ви хочете захопити як JS, так nullі undefined (оскільки різні браузери дадуть вам різні результати), ви використовуєте менш обмежувальне порівняння: наприклад:

var ItemID = Item.get_id();
if (ItemID != null)
{
 //do stuff
}

Це охопить і те, nullіundefined


0

Спробуйте з різною логікою . Ви можете використовувати наступний код для перевірки всіх чотирьох (4) умов для перевірки, як не null, not blank, not undefined and not zero, використовуйте лише цей код (! (! (Змінна))) у javascript та jquery.

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

if(!(!(data)))
{
   //If data has valid value
    alert("data "+data);
} 
else 
{
    //If data has null, blank, undefined, zero etc.
    alert("data is "+data);
}

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.