Чи повинен я використовувати (typeof (val) === 'undefined') або (val === undefined)? - javascript

Це схоже на ряд інших запитань щодо SO, але не точно так само, як я можу знайти.

Який найкращий підхід для перевірки на невизначене значення в Javascript, і чому?

Перший приклад:

var a;
if (typeof(a) === "undefined"){...}

Другий приклад:

var a;
if (a === undefined){...}

Отже, першим прикладом є порівняння назвитип до ланцюжка, а другий порівнює змінну з невизначеним об'єктом, використовуючи оператор рівності, який перевіряє, чи типи однакові, а також значення.

Який краще? Або вони обидва такі хороші, як один одного?

Зауважте, що я не задаюсь питанням про різницю між невизначеною та нульовою, правдивою або неправдивою, тільки котрий з цих двох методів правильна та / або краща.

Відповіді:

9 для відповіді № 1

Якщо змінна не існує, то ви отримаєте еталонну помилку при спробі її використовувати - навіть якщо порівнювати її з undefined. Тому завжди користуйтеся typeof.

> foo === undefined
ReferenceError: foo is not defined
at repl:1:2
at REPLServer.eval (repl.js:80:21)
at Interface.<anonymous> (repl.js:182:12)
at Interface.emit (events.js:67:17)
at Interface._onLine (readline.js:162:10)
at Interface._line (readline.js:426:8)
at Interface._ttyWrite (readline.js:603:14)
at ReadStream.<anonymous> (readline.js:82:12)
at ReadStream.emit (events.js:88:20)
at ReadStream._emitKey (tty.js:320:10)
> typeof foo === "undefined"
true

Також можливе перезаписування (поганого) коду undefined, що призведе до того, що невизначене значення не буде рівним undefined.


1 для відповіді № 2

The undefined може бути присвоєно значення, а перевірка типу не буде працювати. Якщо обсяг коду не захищений, наприклад

(function(undefined){
var a;
if (a === undefined) {
})();
// note called without parameter, so undefined is actually an undefined value

цей спосіб перевірки не є безпечним, і спочатку це краще

Редагувати. Схоже, ECMA 5 розмежовує присвоєння значення невизначеному, але все-таки це залежить від реалізації браузера.


0 для відповіді № 3

Два способи є правильними, але typeof один не залежить від змін до вартості undefined. Якщо вам потрібно чіткіше перевірити, використовуйте typeof().

У стандарті ECMA 3 ви можете змінити значення невизначеного як такого:

undefined = "not undefined";

І це може призвести до потворності, коли порівнюється з undefined в подальшому. У ECMA 5 це заборонено. Це означає, що більшість сучасних браузерів не дозволять вам встановити значення undefined, і ви повинні бути в безпеці використання === undefined.

Крім того, якщо ви навіть не впевнені, чи визначена вами змінна, ви повинні використовувати typeof, інакше ви отримаєте еталонну помилку.


Схожі запитання
Найбільш популярний