NaN равен NaN? - PullRequest
       75

NaN равен NaN?

44 голосов
/ 08 августа 2011
parseFloat("NaN")

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

parseFloat("NaN") == "NaN"

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

Ответы [ 8 ]

34 голосов
/ 27 сентября 2012

Обновление 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.

34 голосов
/ 08 августа 2011

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

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

33 голосов
/ 08 августа 2011

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

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

10 голосов
/ 23 мая 2014

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

function isNaN(x)
{ 
    return x != x; 
}
8 голосов
/ 08 августа 2011
  • Когда Number (возвращается ParseFloat) сравнивается с string string, преобразованным в Number
  • NaN не равно никакому другому объекту (включая NaN)

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

7 голосов
/ 01 октября 2015

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
1 голос
/ 05 апреля 2017

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

0 голосов
/ 17 декабря 2017

Я работаю с 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

После прочтения я понимаю, что это немного лучше, но вау, что за умственная ерунда для новичка LOL

...