Этот код в 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?
Править: Теперь на вопрос ответили, я очистил свое сообщение, чтобы иметь лучшую версию для архива. Однако это представляет некоторые комментарии и даже некоторые ответы, немного непостижимые. Не обвиняйте их авторов. Среди вещей я изменился, был:
Я полагаю, что код пытается спросить, "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 глоток>.
(Мой другой комментарий проявляет практический подход. Вот теоретическая сторона.)
я искал стандарт 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
.
И именно поэтому.
Это является действительно тревожащим. Вот массив значений, которые я протестировал:
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
Пустым указателем не является NaN, а также строка не является NaN. isNaN (), просто тестируют, если Вы действительно сделали, чтобы NaN возразил.
Я не абсолютно уверен когда дело доходит до JS, но я видел подобные вещи на других языках, и это обычно, потому что функция только проверяет, равен ли пустой указатель точно NaN (т.е. пустой === NaN был бы ложью). Другими словами не то, чтобы это думает, что пустой указатель является на самом деле числом, но это скорее, что пустым указателем не является NaN. Это, вероятно, потому что оба представлены по-другому в JS так, чтобы они не были точно равны, таким же образом это 9! == '9'.
Примечание:
"1" == 1 // true
"1" === 1 // false
== оператор делает преобразование типов, в то время как === не делает.
веб-сайт Douglas Crockford , Yahoo! евангелист JavaScript, является большим ресурсом для материала как это.