Почему " NaN " и "Undefined" не являются зарезервированными ключевыми словами в Javascript?

мы можем сделать:

NaN = 'foo' 

а также

undefined = 'foo'

почему они не зарезервированы ключевые слова?

Edit 1 (DownVoters):

  1. Я думаю, что это должно быть реализовано, чтобы быть уверенным, что когда мы ищем number, это number :)

  2. если мы должны использовать IsNaN() или typeof почему NaN или есть?

4 ответов


https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/NaN

NaN является свойством глобального объекта.

начальное значение NaN не является числом-таким же, как и значение Число.бабушка. В современных браузерах NaN не настраивается, незаписываемый собственность. Даже если это не так, избегайте основной он.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/undefined

undefined является свойством глобального объекта, т. е. является переменной в глобальной области видимости.

начальное значение undefined является примитивным значением undefined.


Я не могу сказать вам почему, а undefined и NaN на самом деле свойства глобального объекта:

15.1.1 свойства значения глобального объекта

15.1.1.1 Нэн
Значение Нэн is Нэн (см. п. 8.5). Это свойство имеет атрибуты { [[Writable]]:false, [[перечисли]]: false, [[настраивать]]: false }.
(...)
15.1.1.3 не определено
Значение undefined is неопределено (см. 8.1). Это свойство имеет атрибуты { [[Writable]]:false, [[перечислить]]: false, [[настраивать]]: false }.

существует разница между стоимостью undefined (NaN) и соответствующее свойство.

вы можете заметить [[Writable]]: false. Я не уверен, что это новое в ES5 (и не может быть адаптировано всеми браузерами), но в более новых браузерах (протестировано в Firefox 6), присвоив новое значение undefined не имеет никакого эффекта:

[12:28:15.090] < undefined = "foo"
[12:28:15.093] > "foo"
[12:28:19.882] < undefined
[12:28:19.883] > undefined

таким образом, хотя это кажется вы можете присвоить новое значение, вы на самом деле не может.


почему они не защищены ключевые слова?

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

единственный способ проверить, является ли число NaN использовать isNaN() в любом случае.


я сейчас размышляю, но почему я думаю NaN и undefined не являются ключевыми словами, потому что вы обычно не присваиваете эти значения переменным.

var x = undefined; // doesn't make sense, use null!
var y = NaN; // You can't do much with this variable!

undefined в основном означает uninitialized, и если вы хотите дать понять, что значение неизвестно, вы используете null. Так что undefined обычно означает не инициализированный или результат неправильного кода JavaScript.

NaN редко назначается вручную, просто потому, что вы не можете много сделать с этим значением. Обычно это результат неправильного расчета. Создатели JavaScript, вероятно, не хотели давать этому значению видимость примитивных значений.

и NaN также присутствует на других языках,и он также не используется в качестве ключевого слова. Например:C# NaN представлен Double.NaN, поскольку вы не проводите различие между значениями с плавающей запятой и целочисленными значениями в JavaScript, я предполагаю, что именно поэтому они ставят NaN с глобальным Идентификаторы!

надеюсь, это все прояснит!


NaN не является ключевым словом, а скорее встроенным свойством глобального объекта ,и как таковое может быть заменено (например,undefined, но в отличие от ключевого слова this или литералов true, false и null).

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

или в ореховой скорлупе вы можете сказать, что:

NaN - значение, возвращаемое при попытке обработать то, что это не число как число. Например, результаты 7 раз " abc " не являются числом. Старая его форма-число.NaN вы можете проверить значения не-числа с помощью