我對NaN的工作方式感到困惑。我已執行isNaN(undefined)
它返回true
。但如果我將使用Number.isNaN(undefined)
它將返回false
。所以我應該使用哪一個。另外爲什麼結果有這麼差距。javascript中的isNaN和Number.isNaN之間的混淆
5
A
回答
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立即如果參數不是Number
而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
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
注意最後一列,這通常是什麼我想在我的經驗。
相關問題
- 1. isNaN()vs parseInt()混淆
- 2. Python和Anaconda之間的混淆
- 3. Kbps和KBps之間的混淆
- 4. 黑莓BES和BIS之間的混淆
- 5. JSON和XML之間的混淆
- 6. 芹菜和芹菜之間的混淆
- 7. javascript和silverlight混淆!
- 8. CPP/CLI中的Native和Managed之間的混淆?
- 9. HAVING與WHERE之間的混淆,SQL Server
- 10. JavaScript的\」 \」 IM混淆
- 11. 的JavaScript混淆雙
- 12. javascript IsNaN和0
- 13. Javascript - 全球與本地變量之間的混淆
- 14. 奇怪的$用戶變量之間的drupal 6和ubercart之間的混淆
- 15. JavaScript BlockStatement混淆
- 16. Javascript Promise.all混淆
- 17. 混淆在JavaScript
- 18. RSpec之前/之後的鉤子之間的混淆
- 19. 關於總和值的Javascript混淆
- 20. CLASSPATH和PATH中的混淆
- 21. 因素水平和因素標籤之間的混淆
- 22. Ad-hoc Enterprise Distribution和Enterprise Developer Program之間的混淆
- 23. 道具和狀態之間的混淆react.js
- 24. elif和if語句之間的比較混淆
- 25. ASP.NET 4.0和2.0之間的一些混淆
- 26. 開發人員和測試環境之間的混淆路徑
- 27. Jahia和dotcms之間的混淆作爲一個java CMS
- 28. OOB錯誤率和混淆矩陣之間的一致性
- 29. 熊貓數據框混淆.count和.sum之間的差異
- 30. JTextField和JSlider之間的相互作用 - DocumentListener會混淆
**回答:**'由於兩個等號運算符==和===,在檢查NaN是否爲NaN時求值爲false,函數Number.isNaN()已成爲必需。與全局isNaN()函數相比,Number.isNaN()不會遇到強制將參數轉換爲數字的問題。這意味着現在可以安全地傳遞通常會轉換爲NaN的值,但實際上並不是與NaN相同的值。這也意味着只有類型數值,也就是NaN,返回值爲真。# – Tushar
相關:[Is Number.IsNaN()比isNaN()更多破壞(http://stackoverflow.com/questions/25176459/ is-number-isnan-more-broken-than-isnan) –
不知道這件事。大多數時候我使用isNaN() – Rudra