Поскольку в старых средах (до JS 1.8.5) было возможно изменить значение неопределенного, и проверка того, что не существовала, была сделана таким образом, чтобы можно было сломать. Это является общим выбором для разработки библиотек внутри их собственных затворов, используя шаблон IIFE создать переменную неопределенными, не прикоснулся от внешнего кода (JQuery, например, и большинство библиотек), это пример:
(function(undefined) {
//code which safely uses undefined
})();
Обратите внимание, что есть параметр undefined
, и IIFE вызывается без каких-либо параметров, что делает undefined
эффективным образом undefined
. В новых средах невозможно изменить значение неопределенного, но для ретросовместимости он еще много используется.
Тем не менее, самым надежным способом проверки неопределенного типа является использование typeof
.Его использование, по сути, не может быть переопределено каким-либо образом, и его можно безопасно использовать: typeof foo == 'undefined'
.
Помните, что есть небольшая разница между неопределенному и необъявленной:
var x; //declared but undefined
x === undefined; //true
Но в старых условиях вы были в состоянии сделать
var undefined = 1;
var x; //declared, of type undefined, but...
x === undefined // false, because undefined is 1 and x is of type undefined
Как я уже говорил, самый безопасный способ проверки неопределенной переменной (убедитесь, что она будет работать в более старых средах) - использовать typeof:
var undefined = 1;
var x;
typeof x == 'undefined'; //true
Помните также, что с помощью проверки равенства (==
) с undefined
также проверяет null
(на самом деле, но undefined == null
undefined !== null
), поэтому я рекомендую использовать строго оператор равенства (===
), который проверяет только дляundefined
.
Ответы только для ссылок обескуражены, потому что ресурс может со временем исчезнуть. Пожалуйста, добавьте существенные бит в свой ответ. – Stijn
Я понимаю, что в этом случае есть много деталей, ответы на которые будут неполными без, и я не хотел просто вырезать и вставлять большой раздел этой страницы. Что вы порекомендуете? – guymid
* Как и в случае с ECMA 3, его [...] только Safari обеспечивает это). * Кажется, это соответствующая часть, которую вы можете процитировать, в дополнение к ссылке в вашем ответе. – Stijn