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

时间:2015-10-16 07:24:16

标签: javascript numbers

我对NaN的运作方式感到困惑。我已经执行isNaN(undefined)它已返回true。但是,如果我使用Number.isNaN(undefined),它将返回false。那么我应该使用哪一个。也就是为什么结果会有这么差异。

5 个答案:

答案 0 :(得分:16)

引用ponyfoo article on numbers in 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

答案 1 :(得分:3)

我发现,如果您想检查某些内容是否有问题,那么Number.isNaN()Number.parseInt()Number.parseFloat()的组合(取决于您的期望)是涵盖大多数用例:

考虑: 测试一堆不同的输入变量对几个是数字测试:

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

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

答案 2 :(得分:1)

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

我应该使用哪一个。

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

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.isNumber()            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

答案 3 :(得分:1)

Number.isNaN()

如果值为 Number 类型,则此方法返回 true,并且等于 NaN。否则返回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() 函数将测试值转换为数字,然后对其进行测试。

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

答案 4 :(得分:0)

很快,

Number.isNaN()

  

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

例如&#39; abc&#39;

{{1}}

  

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

例如:&#39; bb&#39; / 33