2015-10-16 53 views
5

我对NaN的工作方式感到困惑。我已执行isNaN(undefined)它返回true。但如果我将使用Number.isNaN(undefined)它将返回false。所以我应该使用哪一个。另外为什么结果有这么差距。javascript中的isNaN和Number.isNaN之间的混淆

+3

**回答:**'由于两个等号运算符==和===,在检查NaN是否为NaN时求值为false,函数Number.isNaN()已成为必需。与全局isNaN()函数相比,Number.isNaN()不会遇到强制将参数转换为数字的问题。这意味着现在可以安全地传递通常会转换为NaN的值,但实际上并不是与NaN相同的值。这也意味着只有类型数值,也就是NaN,返回值为真。# – Tushar

+0

相关:[Is Number.IsNaN()比isNaN()更多破坏(http://stackoverflow.com/questions/25176459/ is-number-isnan-more-broken-than-isnan) –

+0

不知道这件事。大多数时候我使用isNaN() – Rudra

回答

11

要从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
  • isNaN的参数转换为Number和如果所得到的值是NaN返回true。
  • Number.isNaN不转换参数;它在参数为Number且为NaN时返回true。

那么我应该使用哪一个。

我猜你试图检查的值是看起来像一个数字。在这种情况下,答案是既不是。这些功能检查值是否为IEEE-754非A号码。期。例如,这显然是错误的:

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解释将返回false立即如果参数不是NumberisNaN首先将值转换为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 
0

在短期内,

isNaN()

将检查的值数(类型)的转换是失败

对于example'abc”


Number.isNaN()

将检查如果给定的值类型是数字,但不是有效的数字

例如:“BB”/33

2

我发现,如果你要检查什么是数字(或不是),然后是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 

注意最后一列,这通常是什么我想在我的经验。