Источник: http://bonsaiden.github.io/JavaScript-Garden/ru/#core.undefined
undefined
и null
В JavaScript есть два отдельных типа для представления ничего
, при этом более полезным из них является undefined
.
undefined
undefined
— это тип с единственным возможным значением: undefined
.
Кроме этого, в языке определена глобальная переменная со значением undefined
, и эта переменная так и называется — undefined
. Не являясь константой, она не является и ключевым словом. Из этого следует, что её значение можно с лёгкостью переопределить.
Несколько случаев, когда возвращается undefined
:
undefined
(если она не изменена).return
.return
, которые ничего не возвращают.undefined
.undefined
Поскольку глобальная переменная undefined
содержит копию настоящего значения undefined
, присвоение этой переменной нового значения не изменяет значения типа undefined
.
Но при этом, чтобы сравнить что-либо со значением undefined
, прежде нужно получить значение самой переменной undefined
.
Чтобы защитить код от переопределения переменной undefined
, часто используется техника анонимной обёртки, которая использует отсутствующий аргумент.
var undefined = 123;
(function(something, foo, undefined) {
// в локальной области видимости `undefined`
// снова ссылается на правильное значене.
})('Hello World', 42);
Другой способ достичь того же эффекта — использовать определение внутри обёртки.
var undefined = 123;
(function(something, foo) {
var undefined;
...
})('Hello World', 42);
Единственная разница между этими вариантами в том, что последняя версия будет больше на 4 байта при минификации, а в первом случае внутри анонимной обёртки нет дополнительного оператора var
.
null
Хотя undefined
в контексте языка JavaScript чаще используется в качестве традиционного null
, настоящий null
(и тип и литерал) является в большей или меньшей степени просто другим типом данных.
Он используется во внутренних механизмах JavaScript (например для определения конца цепочки прототипов за счёт присваивания Foo.prototype = null
). Но в большинстве случаев тип null
может быть заменён на undefined
.