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

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

parseFloat('geoff') == NaN;

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

Ответы [ 30 ]

1 голос
/ 09 июня 2017
Ответ

marksyzm работает хорошо, но он не возвращает ложь для Infinity, поскольку Infinity технически не является числом.

Я придумал функцию isNumber, которая будет проверять, является ли она числом.

function isNumber(i) {
    return !isNaN(i && i !== true ? Number(i) : parseFloat(i)) && [Number.POSITIVE_INFINITY, Number.NEGATIVE_INFINITY].indexOf(i) === -1;
}

console.log(isNumber(Infinity));
console.log(isNumber("asdf"));
console.log(isNumber(1.4));
console.log(isNumber(NaN));
console.log(isNumber(Number.MAX_VALUE));
console.log(isNumber("1.68"));

UPDATE: я заметил, что этот код не работает для некоторых параметров, поэтому я сделал его лучше.

function isNumber(i) {//function for checking if parameter is number
if(!arguments.length) {
throw new SyntaxError("not enough arguments.");
	} else if(arguments.length > 1) {
throw new SyntaxError("too many arguments.");
	} else if([Number.NEGATIVE_INFINITY, Number.POSITIVE_INFINITY].indexOf(i) !== -1) {
throw new RangeError("number cannot be \xB1infinity.");
	} else if(typeof i === "object" && !(i instanceof RegExp) && !(i instanceof Number) && !(i === null)) {
throw new TypeError("parameter cannot be object/array.");
	} else if(i instanceof RegExp) {
throw new TypeError("parameter cannot be RegExp.");
	} else if(i == null || i === undefined) {
throw new ReferenceError("parameter is null or undefined.");
	} else {
return !isNaN(i && i !== true ? Number(i) : parseFloat(i)) && (i === i);
	}
}
console.log(isNumber(Infinity));
console.log(isNumber(this));
console.log(isNumber(/./ig));
console.log(isNumber(null));
1 голос
/ 19 мая 2017

Нашел другой способ, просто для удовольствия.

function IsActuallyNaN(obj) {
  return [obj].includes(NaN);  
}
1 голос
/ 05 июня 2016

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

function isNum(val){
    var absVal = Math.abs(val);
    var retval = false;
    if((absVal-absVal) == 0){
        retval = true
    }

    return retval;
}
1 голос
/ 04 мая 2016

Другое решение упоминается на странице MDN parseFloat

Предоставляет функцию фильтра для строгого анализа

var filterFloat = function (value) {
    if(/^(\-|\+)?([0-9]+(\.[0-9]+)?|Infinity)$/
      .test(value))
      return Number(value);
  return NaN;
}


console.log(filterFloat('421'));               // 421
console.log(filterFloat('-421'));              // -421
console.log(filterFloat('+421'));              // 421
console.log(filterFloat('Infinity'));          // Infinity
console.log(filterFloat('1.61803398875'));     // 1.61803398875
console.log(filterFloat('421e+0'));            // NaN
console.log(filterFloat('421hop'));            // NaN
console.log(filterFloat('hop1.61803398875'));  // NaN

И затем вы можете использовать isNaN, чтобы проверить, является ли оно NaN

1 голос
/ 19 сентября 2017

Is (NaN> = 0) ? ...... " Не знаю ".

function IsNotNumber( i ){
    if( i >= 0 ){ return false; }
    if( i <= 0 ){ return false; }
    return true;
}

Условия выполняются, только если TRUE .

Не включен FALSE .

Не включено " Я не знаю ".

1 голос
/ 28 октября 2014

Согласно IEEE 754, все отношения с участием NaN оцениваются как ложные, кроме! =. Таким образом, например, (A> = B) = false и (A <= B) = false, если A или B или оба являются / являются NaN. </p>

1 голос
/ 16 февраля 2019

Правило:

NaN != NaN

Проблема функции isNaN () в том, что она может возвращать неожиданный результат в некоторых случаях:

isNaN('Hello')      //true
isNaN('2005/12/12') //true
isNaN(undefined)    //true
isNaN('NaN')        //true
isNaN(NaN)          //true
isNaN(0 / 0)        //true

Лучший способ проверить, действительно ли значение NaN:

function is_nan(value) {
    return value != value
}

is_nan(parseFloat("geoff"))
1 голос
/ 30 ноября 2015

Я написал этот ответ на другой вопрос по StackOverflow , где другой проверяет, когда NaN == null, но затем он был отмечен как дубликат, поэтому я не хочу тратить свою работу.

Посмотрите на Сеть разработчиков Mozilla о NaN.


Краткий ответ

Просто используйте distance || 0, если хотите убедиться, что вы указали правильное число, или isNaN(), чтобы проверить его.

Длинный ответ

NaN (Not-a-Number) - это странный глобальный объект в javascript, часто возвращаемый при сбое в математической операции.

Вы хотели проверить, если NaN == null, что приводит к false. Hovewer даже NaN == NaN результаты с false.

Простой способ выяснить, является ли переменная NaN глобальной функцией isNaN().

Другой - x !== x, который верен только тогда, когда х равен NaN. (спасибо, что напомнили @ Raphael-Schweikert)

Но почему короткий ответ сработал?

Давайте узнаем.

При вызове NaN == false результат равен false, то же самое с NaN == true.

Где-то в спецификациях JavaScript есть запись с всегда ложными значениями, которая включает в себя:

  • NaN - номер не указан
  • "" - пустая строка
  • false - логическое значение false
  • null - нулевой объект
  • undefined - неопределенные переменные
  • 0 - числовой 0, включая +0 и -0
0 голосов
/ 23 февраля 2017

Просто преобразуйте результат в строку и сравните с NaN.

var val = Number("test");
if(String(val) === 'NaN') {
   console.log("true");
}
0 голосов
/ 19 декабря 2017

Итак, я вижу несколько ответов на это,

Но я просто использую:

function isNaN(x){
     return x == x && typeof x == 'number';
}
...