Почему isNaN (пустой) == ложь в JS?

Этот код в JS дает мне всплывающее окно, говоря, что "я думаю, что пустой указатель является числом", которое я нахожу немного тревожащими. Что я пропускаю?

if (isNaN(null)) {
  alert("null is not a number");
} else {
  alert("i think null is a number");
}

Я использую Firefox 3. Это - ошибка браузера?

Другие тесты:

console.log(null == NaN);   // false
console.log(isNaN("text")); // true
console.log(NaN == "text"); // false

Так, проблема, кажется, не точное сравнение с NaN?

Править: Теперь на вопрос ответили, я очистил свое сообщение, чтобы иметь лучшую версию для архива. Однако это представляет некоторые комментарии и даже некоторые ответы, немного непостижимые. Не обвиняйте их авторов. Среди вещей я изменился, был:

  • Удаленный примечание, говоря, что я завинтил заголовок во-первых путем возвращения его значения
  • Более ранние ответы показали, что я не четко дал понять достаточно, почему я думал, что поведение было странным, таким образом, я добавил примеры, которые проверяют строку и делают ручное сравнение.
116
задан H. Pauwelyn 29 August 2019 в 06:28
поделиться

6 ответов

Я полагаю, что код пытается спросить, "x числовые?" с конкретным случаем здесь x = null. Функция isNaN() может использоваться для ответа на этот вопрос, но семантически это относится конкретно к значению NaN. Из Википедии для [1 126] NaN :

NaN ( Not умбра N) является значением типа числовых данных, представляющего неопределенное или непредставимое значение, особенно в вычислениях с плавающей точкой.

В большинстве случаев мы думаем, что ответ на "пустой числовой?" должен быть нет. Однако isNaN(null) == false семантически корректно, потому что null не NaN.

Вот алгоритмическое объяснение:

функция isNaN(x) попытки преобразовать переданный параметр в число <глоток> 1 (эквивалентный Number(x)) и затем тестируют, если значение NaN. Если параметр не может быть преобразован в число, Number(x) возвратится NaN <глоток> 2 . Поэтому, если преобразование параметра x к числу приводит к [1 114], это возвращает true; иначе это возвращает false.

Так в конкретном случае x = null, null преобразовывается в номер 0, (попытайтесь оценить Number(null) и посмотрите, что это возвращается 0) и isNaN(0) возвращает false. Строка, которая является только цифрами, может быть преобразована в число, и isNaN также возвращает false. Строка (например, 'abcd'), который не может быть преобразован в число, заставит isNaN('abcd') возвращать true, конкретно потому что Number('abcd') возвраты NaN.

В дополнение к этим очевидным пограничным случаям стандартные числовые причины возврата NaN как 0/0.

Что касается на вид непоследовательных тестов для равенства, показанного в вопросе, поведение [1 123] определяется таким образом, что любое сравнение x == NaN является ложью, независимо от другого операнда, включая [1 125] самого <глоток> 1 .

107
ответ дан Glenn Moss 24 November 2019 в 02:18
поделиться

(Мой другой комментарий проявляет практический подход. Вот теоретическая сторона.)

я искал стандарт ECMA 262 , который является тем, что реализует JavaScript. Их спецификация для isNan:

Применяет ToNumber к его аргументу, затем возвращает true, если результат является NaN, и иначе возвращает false.

Раздел 9.3 определяет поведение ToNumber (который не является вызываемой функцией, а скорее компонентом системы преобразования типов). Для суммирования таблицы определенные входные типы могут произвести NaN. Это тип undefined, тип number (но только значение NaN), любой объект, примитивное представление которого NaN, и любой string, который не может быть проанализирован. Это уезжает undefined, NaN, new Number(NaN), и большинство строк.

Любой такой вход, который производит NaN как вывод, когда передано [1 110], произведет true, когда питается к [1 112]. С тех пор null может успешно быть преобразован в число, оно не производит true.

И именно поэтому.

7
ответ дан treat your mods well 24 November 2019 в 02:18
поделиться

Это является действительно тревожащим. Вот массив значений, которые я протестировал:

var x = [undefined, NaN, 'blah', 0/0, null, 0, '0', 1, 1/0, -1/0, Number(5)]

Это оценивает (в консоли Firebug) к:

,NaN,blah,NaN,,0,0,1,Infinity,-Infinity,5

, Когда я звоню x.map(isNaN) (для вызова isNaN на каждом значении), я добираюсь:

true,true,true,true,false,false,false,false,false,false,false

В заключение isNaN довольно бесполезные взгляды! ( Редактирование : Кроме него оказывается, что isNaN [только 116] определили по Числу, в этом случае это работает просто великолепно - только с вводящим в заблуждение именем.)

Кстати, вот типы тех значений:

x.map(function(n){return typeof n})
-> undefined,number,string,number,object,number,string,number,number,number,number
7
ответ дан treat your mods well 24 November 2019 в 02:18
поделиться

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

5
ответ дан gizmo 24 November 2019 в 02:18
поделиться

Я не абсолютно уверен когда дело доходит до JS, но я видел подобные вещи на других языках, и это обычно, потому что функция только проверяет, равен ли пустой указатель точно NaN (т.е. пустой === NaN был бы ложью). Другими словами не то, чтобы это думает, что пустой указатель является на самом деле числом, но это скорее, что пустым указателем не является NaN. Это, вероятно, потому что оба представлены по-другому в JS так, чтобы они не были точно равны, таким же образом это 9! == '9'.

1
ответ дан Jason Tennier 24 November 2019 в 02:18
поделиться

Примечание:

"1" == 1 // true
"1" === 1 // false

== оператор делает преобразование типов, в то время как === не делает.

веб-сайт Douglas Crockford , Yahoo! евангелист JavaScript, является большим ресурсом для материала как это.

0
ответ дан cllpse 24 November 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: