2015-10-16 54 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 

注意最後一列,這通常是什麼我想在我的經驗。