2012-05-28 3 views
5

Это похоже на ряд других вопросов по SO, но не совсем то же самое, что я могу найти.Должен ли я использовать (typeof (val) === 'undefined') или (val === undefined)?

Каков наилучший подход для проверки неопределенного значения в Javascript и почему?

Первый пример:

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

Второй пример:

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

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

Что лучше? Или они оба хороши друг другу?

Обратите внимание, что я не спрашиваю о какой-либо разнице между неопределенным и нулевым, или правдивым или ложным, только тот из этих двух методов является правильным и/или лучше.

+0

Afaik они такие же, если вы либо создали свой собственный локальный 'undefined', либо можете доверить, что ни один идиот не переопределит его на' true' или что-то еще. – Amadan

+2

'typeof' не является функцией. Вам не нужны парнеры. –

+2

Первый метод более безопасен, потому что (A) вам не нужно беспокоиться, действительно ли переменная 'undefined' содержит значение' undefined', и (B) вам не нужно беспокоиться о контрольных ошибках в случае, если ваш операнд оказывается незаявленной. –

ответ

9

Если переменная не существует, вы получите опорную ошибку при попытке ее использования - даже если вы сравниваете ее с 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.

+0

Вопрос включал объявление ('var a'), поэтому этого не произойдет в этом конкретном сценарии. В общем, я дам вам все правильно. – Amadan

+0

Много хороших ответов и баллов, спасибо всем. Да, var a был намеренным. –

+0

Строгое равенство не требуется, '==' достаточно. – RobG

1

undefined может быть присвоено значение, и проверка типа не будет работать. Если объем кода не защищен, например.

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

этот способ проверить это не безопасно, и первый из них предпочитаемое

Edit: Кажется, что ECMA 5 dissalows назначая значение неопределенного, но все это зависит от реализации браузера.

+0

Это отличный способ гарантировать, что 'undefined' действительно не определено, так как неопределенное определение. – mikeycgto

+0

Вы также можете сравнить с 'void 0', но сравнение с неинициализированной переменной тоже нормально. О, и 'undefined' имеет значение, значение [undefined] (http://es5.github.com/#x4.3.9). ;-) – RobG

0

Два метода верны, но typeof невосприимчив к изменениям в размере undefined. Если вам нужна более строгая проверка, используйте typeof().

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

undefined = "not undefined"; 

И это может привести к уродству, когда по сравнению с undefined позже. В ECMA 5 это запрещено. Это означает, что большинство современных браузеров не позволят вам установить значение undefined, и вы должны быть в безопасности, используя === undefined.

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

+0

Назначение 'undefined' будет только в строгом режиме ES5. –

+0

Нет необходимости в операторе группировки с 'typeof', это оператор, а не функция. – RobG

Смежные вопросы