NaN равно NaN?

parseFloat("NaN")

возвращает "NaN", но

parseFloat("NaN") == "NaN"

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

Ответ 1

Когда функция JavaScript возвращает NaN, это не литеральная строка, а свойство объекта в глобальном пространстве. Вы не можете сравнить его со строкой "NaN".

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

Ответ 2

Это особый случай, NaN - единственное, что в Javascript не равно самому себе.

Хотя другие ответы о строках и объекте NaN тоже верны.

Ответ 3

Обновление 2

Новым для ECMAScript 6 является функция Object.is(). Это предназначено для дальнейшего улучшения проверки ===. Одним из преимуществ этой новой функции является то, что Object.is(NaN, NaN) теперь вернет true. Если вы можете использовать ECMAScript 6, то это будет наиболее читаемым и последовательным решением для вас.

Оригинал

Правильный способ проверить это:

isNaN(parseInt(variable))

Если все, что вы проверяете, является NaN, эта функция вернет true. Этот метод встроен в спецификацию JavaScript.

Использование jQuery

jQuery, встроенный в свою собственную функцию isNaN изначально, чтобы помочь противостоять некоторым расхождениям между браузерами и добавить дополнительные проверки, чтобы их версия могла использоваться вместо той, что была в VanillaJS.

Обновление для jQuery

После jQuery 1.7 они изменили эту функцию на $.isNumeric().

Документация коммутатора

Если вы посмотрите на этот вопрос о переполнении стека, вы найдете много раз, когда isNaN() возвращает то, что было бы интуитивно считаться "неправильным" ответом, но верно по спецификации.

Одна из главных причин избежать ваниль isNaN() заключается в том, что null вернет false, заставив вас подумать, что это число. Однако функция jQuery охватывает гораздо больший диапазон интуитивных результатов.

Из их документации:

Как и jQuery 3.0 $.isNumeric() возвращает true, только если аргумент имеет значение типа, или если это строка типа, и она может быть принудительно введена в конечные числа. Во всех остальных случаях он возвращает false.

Ответ 4

NaN является одним из немногих примеров объекта, который не равен самому себе. Фактически это свойство используется для реализации общего метода bool IsNaN(number):

function isNaN(x)
{ 
    return x != x; 
}

Ответ 5

  • Когда Number (возвращается ParseFloat) сравнивается с string string, преобразованным в Number
  • NaN не равно любому другому объекту (включая NaN)

Вы получаете NaN==NaN. Это второе правило неверно.

Ответ 6

isNaN работает для всех значений, которые не являются номерами

isNaN('foo') == true
isNaN(NaN) == true
isNaN(12) == false
isNaN([1,2,3]) == true

Если, однако, вы хотите специально проверить NaN или избежать принуждения типа, вы можете использовать Number.isNaN вместо

Number.isNaN('foo') == false
Number.isNaN(NaN) == true
Number.isNaN(12) == false
Number.isNaN([1,2,3]) == false

Ответ 7

В ECMAScript 6 Object.is() является улучшением ===. Этот метод принимает два аргумента и возвращает true, если значения эквивалентны. И эти два значения считаются эквивалентными, если они одного типа и имеют одинаковое значение. Причина в том, что console.log(Object.is(NaN, NaN)) → TRUE

Ответ 8

Я работаю с Google Apps Script, и поэтому я застрял в ECMA 5. Как и в случае с Electric Coffee, вот что я смог выяснить, что, похоже, дает верный ответ о том, значение действительно NaN, а не если значение NaN, но если оно фактически NaN:

function isThisNaN(x)
{ 
    return isNaN(x) && Object.prototype.toString.call(x) === '[object Number]'; 
}
console.log(isThisNaN(NaN)); // true

lol Просто смешно, что Object.prototype.toString.call(NaN) равно '[object Number]'. Мой мозг новичка говорит мне, что NaN - "Не номер", но, к сожалению, это просто не так просто.

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

isNaN('a'); // true
isNaN(' '); // false

так что даже если ' ' - это нечисловая строка, она, по-видимому, укорачивается в число (0).

console.log(Number(' ')); // 0.0

Однако...

console.log( 0  ? true : false); // false
console.log(' ' ? true : false); // true

После прочтения больше я понимаю это немного лучше, но ничего себе, что ментальный crapstorm для новичка lol