我对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