Принцип неопределенности джаваскрипта
undefined
-- это глобальная переменная со значением undefined. Она не является константой или ключевым словом и с легкостью может быть переопределена.
Естественно, защититься от этого поведения можно достаточно легко и не принужденно. Варианты:
- вместо слова
undefined
использовать любое выражение, возвращающееundefined
. Допустим,void(0)
. - объявить локальную переменную undefined со значением по-умолчанию
undefined
. - Добавить дополнительный формальный параметр в вызваемую функцию и не передавать фактический:
(function(undefined) { /* ... */ })()
'undefined' === typeof variable
не зависит от переопределенной переменнойundefined
Вариант if(something) {}
писать нельзя, ибо пустая строка, ноль при конвертировании в boolean
тоже возвращают false
. А задача стоит на проверку undefined
значения.
При всех описанных вариантах необходимо помнить о таком поведении интерпретатора и постоянно заботиться о защите от переопределения.
Начиная с ECMAScript 5 включена поддержка строгого режима (англ. strict mode) в котором помимо всего прочего есть поддержка read-only свойств объекта. Используя строгий режим, включим у window.undefined
режим ‘только для чтения’:
"use strict";
Object.defineProperty(window, "undefined", {
value: void(0),
writable: false
});
После выполнения этого кода любая попытка переопределить undefined
свойство объекта window
ни к чему не приведет. Интерпретатор проигнорирует переопределение.
Поддержка браузеров, кстати, обнадеживает. Игнорируя Internet Explorer восьмой версии, можно смело пользоваться! Что касается серверного джаваскрипта, то можете быть спокойны -- undefined не переопределяется.
Предупреждение: Будьте бдительны! Строгий режим на то и строгий, чтобы бить по рукам за каждую оплошность.
Ссылки по теме: