Почему «NaN» и «Undefined» не являются зарезервированными ключевыми словами в Javascript? - PullRequest
15 голосов
/ 24 августа 2011

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

NaN = 'foo' 

а также

undefined = 'foo'

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

Изменить 1 (DownVoters):

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

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

Ответы [ 4 ]

8 голосов
/ 24 августа 2011

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

15,1.1 Значение Свойства Глобального объекта

15.1.1.1 NaN
Значение NaN равно NaN ( см. 8,5 ).Это свойство имеет атрибуты {[[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: false }.
(...)
15.1.1.3 undefined
Значение undefined равно undefined ( см. 8.1 ).Это свойство имеет атрибуты {[[Writable]]: false , [[Enumerable]]: false , [[Configurable]]: 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

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


Почему они не являются зарезервированными ключевыми словами?1069 *

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

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

7 голосов
/ 24 августа 2011

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

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

Начальным значением NaN является Not-A-Number - то же, что и значение Number.NaN. В современных браузерах NaN не настраивается, не подлежащая записи собственность. Даже если это не так, избегайте переопределяя это.

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

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

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

3 голосов
/ 10 декабря 2012

Сейчас я размышляю, но причина, по которой я считаю 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 с глобальными идентификаторами!

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

1 голос
/ 24 августа 2011

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

Вы можете проверить, является ли значение NaN с помощью функции isNaN(). Более того, NaN определяется как неравный всему, включая себя.

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

NaN - это значение, возвращаемое при попытке обработать что-то, что не является числом, как число. Например, результат 7 раз «abc» не является числом. Его старая форма - Number.NaN. Вы можете проверить не числовые значения с помощью функции isNaN().

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...