javascript 中 isNaN 和 Number.isNaN 之间的混淆

问题描述 投票:0回答:6

我对 NaN 的工作原理感到困惑。我已经执行了

isNaN(undefined)
它返回了
true
。但如果我使用
Number.isNaN(undefined)
,它就会返回
false

那么我应该使用哪一个呢?还有为什么结果有这么大的差异?

javascript numbers
6个回答
107
投票

引用 ponyfoo 关于 ES6 中数字的文章

Number.isNaN 与 ES5 全局 isNaN 方法几乎相同。 Number.isNaN 返回提供的值是否等于 NaN。这是一个 与“这不是一个数字吗?”的问题非常不同。

所以

isNaN
只是检查传递的值是否不是数字或无法转换为数字。另一方面,
Number.isNaN
仅检查该值是否等于
NaN
(尽管它使用与
===
不同的算法)。

例如字符串

'ponyfoo'
不是数字,无法转换为数字,但它不是
NaN

示例:

Number.isNaN({});
// <- false, {} is not NaN
Number.isNaN('ponyfoo')
// <- false, 'ponyfoo' is not NaN
Number.isNaN(NaN)
// <- true, NaN is NaN
Number.isNaN('pony'/'foo')
// <- true, 'pony'/'foo' is NaN, NaN is NaN

isNaN({});
// <- true, {} is not a number
isNaN('ponyfoo')
// <- true, 'ponyfoo' is not a number
isNaN(NaN)
// <- true, NaN is not a number
isNaN('pony'/'foo')
// <- true, 'pony'/'foo' is NaN, NaN is not a number

35
投票
  • isNaN
    将参数转换为
    Number
    ,如果结果值为
    NaN
    ,则返回 true。
  • Number.isNaN
    不转换参数;当参数是
    Number
    并且是
    NaN
    时,它返回 true。

那么我应该使用哪一个。

我猜您正在尝试检查该值是否是看起来像数字。在这种情况下,答案是“都不是”。这些函数检查该值是否为 IEEE-754 Not A Number。时期。例如,这显然是错误的:

var your_age = ""; // user forgot to put in their age if (isNaN(your_age)) { alert("Age is invalid. Please enter a valid number."); } else { alert("Your age is " + your_age + "."); } // alerts "Your age is ." // same result when you use Number.isNaN above

还有为什么结果有这么大的差异。

如上所述,如果参数不是
Number.isNaN

Number
将立即返回 false,而
isNaN
首先将值转换为
Number
。这会改变结果。一些例子:

| Number.isNaN() | isNaN() ----------------+----------------------------+----------------------- value | value is a Number | result | Number(value) | result ----------------+-------------------+--------+---------------+------- undefined | false | false | NaN | true {} | false | false | NaN | true "blabla" | false | false | NaN | true new Date("!") | false | false | NaN | true new Number(0/0) | false | false | NaN | true



20
投票
Number.isNaN()

Number.parseInt()
Number.parseFloat()
(取决于您的期望)组合可以覆盖大多数用例:

考虑: 针对多个 is 数字测试测试一堆不同的输入变量:

r = [NaN, undefined, null, false, true, {}, [], '', ' ', 0, 1, '0', '1'] .map(function(v){return [ v, isNaN(v), Number.isNaN(v), Number.isInteger(v), Number.parseInt(v, 10), Number.isNaN( Number.parseInt(v, 10)) ];}); console.table(r); // or if console.table() not available: r.join('\n', function(v){v.join(',')} );

结果:

NaN , true , true , false, NaN, true undefined, true , false, false, NaN, true null , false, false, false, NaN, true false , false, false, false, NaN, true true , false, false, false, NaN, true Object , true , false, false, NaN, true Array(0) , false, false, false, NaN, true '' , false, false, false, NaN, true ' ' , false, false, false, NaN, true 0 , false, false, true , 0 , false 1 , false, false, true , 1 , false '0' , false, false, false, 0 , false '1' , false, false, false, 1 , false

注意最后一栏,这通常是我在经验中想要的。


6
投票

isNaN()


将检查值转换为Number(类型)是否失败

例如'abc'


Number.isNaN()


将检查给定值类型是否为数字但不是有效数字

例如:'bb'/33


3
投票
NaN

的无用意义,只需将其视为

bad number
即可。当您看到
NaN
时,请将其解读为“错误号码”。

Number.isNaN

isNaN
的更安全、更健壮的版本,
isNaN
有一个bug,
isNaN(NaN) // true, this is the supposed result, the argument is NaN
isNaN('hello') // true, but this is misleading, cuz `hello` is not NaN

isNaN

无法将

NaN
与其他非数字值(例如字符)区分开。
因此一种新方法开始发挥作用。

Number.isNaN 首先检查该值是否为数字,如果不是数字,则立即返回 false。

Number.isNaN('hello') // false, 'hello' is not NaN, this is the supposed result

    


2
投票
Number.isNaN()

如果该值是 Number 类型并且等于 NaN,则此方法返回 true。否则返回 false。 例如

Number.isNaN(123) //false Type of 123 is number but 123 is not equal to NaN, therefore it returns false. Number.isNaN('123') //false Type of 123 is string & '123' is not equal to NaN, therefore it returns false. Number.isNaN(NaN) //true Type of NaN is number & NaN is equal to NaN, therefore it returns true. Number.isNaN('NaN') //false Type of 'NaN' is string & 'NaN' is not equal to NaN, therefore it returns false.

全局 
isNaN()

函数 全局 isNaN() 函数将测试值转换为 Number,然后进行测试。

isNaN(123) //false isNaN('123') //false isNaN(NaN) //true isNaN('NaN') //true

© www.soinside.com 2019 - 2024. All rights reserved.