我对NaN的工作原理感到困惑。我已经执行了返回true的isNaN(undefined)。但是如果我要使用Number.isNaN(undefined),它会返回false。那么我应该用哪一个呢?还有为什么在结果中会有如此大的差异。
发布于 2015-10-16 15:34:45
引用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发布于 2015-10-16 16:04:48
如果结果值为NaN.
Number.isNaN,则isNaN将参数转换为NaN.,并返回Number;如果参数为Number且为true,则返回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,Number.isNaN将立即返回false,而isNaN首先将值转换为Number。这会改变结果。下面是一些例子:
| Number.isNaN() | 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发布于 2017-05-31 22:39:45
我发现,如果你想检查某个东西是不是数字,那么结合使用Number.isNaN()和Number.parseInt()或Number.parseFloat() (取决于你的期望)就可以覆盖大多数用例:
考虑:针对几个is编号测试测试一组不同的输入变量:
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请注意最后一列,这通常是我在经验中想要的。
https://stackoverflow.com/questions/33164725
复制相似问题