我对NaN的运作方式感到困惑。我已经执行isNaN(undefined)
它已返回true
。但是,如果我使用Number.isNaN(undefined)
,它将返回false
。那么我应该使用哪一个。也就是为什么结果会有这么差异。
答案 0 :(得分:16)
引用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 :(得分:3)
我发现,如果您想检查某些内容是否有问题,那么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
请注意最后一栏,这通常是我想要的经验。
答案 2 :(得分:1)
isNaN
将参数转换为Number
,如果结果值为NaN
,则返回true。Number.isNaN
不转换参数;当参数为Number
并且为NaN
时,它返回true。我应该使用哪一个。
我猜您正在尝试检查该值是否为看起来像数字。在这种情况下,答案是既不。这些函数检查值是否为 IEEE-754非数字。期。例如,这显然是错误的:
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
如果参数不是Number
则会立即返回false,而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
答案 3 :(得分:1)
Number.isNaN()
如果值为 Number 类型,则此方法返回 true,并且等于 NaN。否则返回false。 例如
Number.isNaN(123) //false
Type of 123 is number but 123 is not equal to NaN, therefore it returns false.
Number.isNaN('123') //false
Type of 123 is string & '123' is not equal to NaN, therefore it returns false.
Number.isNaN(NaN) //true
Type of NaN is number & NaN is equal to NaN, therefore it returns true.
Number.isNaN('NaN') //false
Type of 'NaN' is string & 'NaN' is not equal to NaN, therefore it returns false.
全局isNaN()函数
全局 isNaN() 函数将测试值转换为数字,然后对其进行测试。
isNaN(123) //false
isNaN('123') //false
isNaN(NaN) //true
isNaN('NaN') //true
答案 4 :(得分:0)
很快,
Number.isNaN()
将检查值转换为Number(type)是否失败
例如&#39; abc&#39;
{{1}}
将检查给定的值类型是否为Number但不是有效数字
例如:&#39; bb&#39; / 33