Как проверить, является ли число NaN в JavaScript? - PullRequest
377 голосов
/ 16 апреля 2010

Я пробовал это только в консоли JavaScript Firefox, но ни одно из следующих утверждений не возвращает true:

parseFloat('geoff') == NaN;

parseFloat('geoff') == Number.NaN;

Ответы [ 30 ]

5 голосов
/ 09 сентября 2017

NaN в JavaScript означает «не число», хотя на самом деле его тип - число.

typeof(NaN) // "number"

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

var myVar = "A";
isNaN(myVar) // true, although "A" is not really of value NaN

Что действительно происходит здесь, так это то, что myVar неявно приводится к числу:

var myVar = "A";
isNaN(Number(myVar)) // true. Number(myVar) is NaN here in fact

Это действительно имеет смысл, потому что «А» на самом деле не число. Но мы действительно хотим проверить, имеет ли myVar значение NaN.

Так что isNaN () не может помочь. Тогда что мы должны делать вместо этого?

В свете того, что NaN является единственным значением JavaScript, которое обрабатывается неравномерно для самого себя, поэтому мы можем проверить его равенство самому себе, используя! ==

var myVar; // undefined
myVar !== myVar // false

var myVar = "A";
myVar !== myVar // false

var myVar = NaN
myVar !== myVar // true

Итак, чтобы сделать вывод , если верно, что переменная! == сама по себе, то эта переменная в точности имеет значение NaN:

function isOfValueNaN(v) {
    return v !== v;
}

var myVar = "A";
isNaN(myVar); // true
isOfValueNaN(myVar); // false
5 голосов
/ 14 августа 2015

Если ваша среда поддерживает ECMAScript 2015 , то вы можете использовать Number.isNaN, чтобы убедиться, что значение действительно NaN.

Проблема с isNaN заключается в том, что , если вы используете это с нечисловыми данными, применяется несколько непонятных правил (согласно MDN). Например,

isNaN(NaN);       // true
isNaN(undefined); // true
isNaN({});        // true

Итак, в средах, поддерживаемых ECMA Script 2015, вы можете использовать

Number.isNaN(parseFloat('geoff'))
4 голосов
/ 18 октября 2012

Я использую функцию подчеркивания isNaN, потому что в JavaScript:

isNaN(undefined) 
-> true

По крайней мере, помните об этом гоче.

4 голосов
/ 20 марта 2014

Я просто хочу поделиться другой альтернативой, она не обязательно лучше, чем другие здесь, но я думаю, что стоит посмотреть:

function customIsNaN(x) { return (typeof x == 'number' && x != 0 && !x); }

Логика этого заключается в том, что каждое число, кроме 0 и NaN приведены к true.

Я провел быстрый тест, и он работает так же хорошо, как Number.isNaN и проверяет себя на ложность.Все три работают лучше, чем isNan

Результаты

customIsNaN(NaN);            // true
customIsNaN(0/0);            // true
customIsNaN(+new Date('?')); // true

customIsNaN(0);          // false
customIsNaN(false);      // false
customIsNaN(null);       // false
customIsNaN(undefined);  // false
customIsNaN({});         // false
customIsNaN('');         // false

Может оказаться полезным, если вы хотите избежать нарушения функции isNaN.

3 голосов
/ 30 августа 2017

function isNotANumber(n) {
  if (typeof n !== 'number') {
    return true;
  } 
  return n !== n;
}
3 голосов
/ 06 мая 2013

Кажется, что isNaN () не поддерживается в Node.js из коробки.
Я работал с

var value = 1;
if (parseFloat(stringValue)+"" !== "NaN") value = parseFloat(stringValue);
2 голосов
/ 01 февраля 2018

Может быть и так:

function isNaNCustom(value){
    return value.toString() === 'NaN' && 
           typeof value !== 'string' && 
           typeof value === 'number'
}
2 голосов
/ 30 мая 2016

Точный способ проверки:

//takes care of boolen, undefined and empty

isNaN(x) || typeof(x) ==='boolean' || typeof(x) !=='undefined' || x!=='' ? 'is really a nan' : 'is a number'
2 голосов
/ 09 ноября 2014
NaN === NaN;        // false
Number.NaN === NaN; // false
isNaN(NaN);         // true
isNaN(Number.NaN);  // true

Оператор равенства (== и ===) нельзя использовать для проверки значения по NaN.

Посмотрите на Документация Mozilla Глобальное свойство NaN - это значение, представляющее Not-A-Numbe

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

1 голос
/ 16 августа 2017
alert("1234567890.".indexOf(String.fromCharCode(mycharacter))>-1);

Это не элегантно. но после попытки isNAN () я пришел к этому решению, которое является другой альтернативой. В этом примере я также разрешил '.' потому что я маскируюсь для поплавка. Вы также можете отменить это, чтобы убедиться, что номера не используются.

("1234567890".indexOf(String.fromCharCode(mycharacter))==-1)

Это односимвольная оценка, но вы также можете просмотреть строку для проверки любых чисел.

...