2013-09-25 4 views
1

Как вы видите, undefined не является ключевым словом в javascript (правильно?). Поэтому мы можем использовать его как переменную, хотя я уверен, что это плохая идея. Теперь мой вопрос: почему я не могу дать значение undefined.Хотите узнать больше об Undefined

Код:

var undefined=3; 

undefined;//still undefined 

Любые предложения будут благодарностью.

ответ

2

Поскольку в старых средах (до 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 == nullundefined !== null), поэтому я рекомендую использовать строго оператор равенства (===), который проверяет только дляundefined.

1

Смотреть полное объяснение (я не автор), как «не определен» используется в JavaScript здесь http://javascriptweblog.wordpress.com/2010/08/16/understanding-undefined-and-preventing-referenceerrors/

По сравнению с другими языками, концепция в JavaScript неопределенных является немного запутанным. В частности, пытаясь понять ReferenceErrors («x не определено»), и как лучше всего их кодировать может быть расстраивающим.

В JavaScript есть неопределенный (тип), неопределенный (значение) и неопределенный (переменный).

Undefined (type) - это встроенный тип JavaScript.

undefined (значение) является примитивным и является единственным значением Неопределенный тип. Любому имуществу, которому не присвоено значение, принимает неопределенное значение. (ECMA 4.3.9 и 4.3.10). Функция без оператора возврата или функция с пустым возвратом инструкция возвращает неопределенные. Значение аргумента unsupplied не определено.

undefined (variable) - это глобальное свойство, начальным значением которого является undefined (value). Поскольку его глобальное свойство мы также можем получить к нему в качестве переменной.

По ECMA 3, его значение может быть переназначен:

undefined = "washing machine"; //assign a string to undefined (variable) 
typeof undefined //"string" 

f = undefined; 
typeof f; //"string" 
f; //"washing machine" 

Излишне говорить, что повторное присвоение значения к неопределенной переменной очень плохая практика, а на самом деле его не допускается по ECMA 5 (хотя среди текущий набор полных версий браузера, только Safari обеспечивает это).

+0

Ответы только для ссылок обескуражены, потому что ресурс может со временем исчезнуть. Пожалуйста, добавьте существенные бит в свой ответ. – Stijn

+0

Я понимаю, что в этом случае есть много деталей, ответы на которые будут неполными без, и я не хотел просто вырезать и вставлять большой раздел этой страницы. Что вы порекомендуете? – guymid

+0

* Как и в случае с ECMA 3, его [...] только Safari обеспечивает это). * Кажется, это соответствующая часть, которую вы можете процитировать, в дополнение к ссылке в вашем ответе. – Stijn

1

В соответствии с MDN неопределенный статус стал неприменимым, начиная с JavaScript 1.8.5. Это означает, что было полностью «законно» использовать его в качестве переменной до тех пор.
Но это, очевидно, не очень хорошая идея.

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