Pra*_*edi 15 javascript numbers
我对NaN的运作方式感到困惑.我已经执行了isNaN(undefined)它返回true.但是,如果我将使用Number.isNaN(undefined)它返回false.那么我应该使用哪一个.也是为什么结果如此不一致的原因.
nil*_*ils 19
Number.isNaN几乎与ES5 global isNaN方法相同.Number.isNaN返回提供的值是否等于NaN.这是一个非常不同的问题,"这不是一个数字吗?".
因此,isNaN只检查传递的值是否不是数字或不能转换为数字.Number.isNaN另一方面,只检查值是否等于NaN(它使用的算法与其他算法不同===).
'ponyfoo'例如,String 不是数字,不能转换为数字,但事实并非如此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
Run Code Online (Sandbox Code Playgroud)
Sal*_*n A 19
isNaN将参数转换为 a Number,如果结果值为 ,则返回 true NaN。Number.isNaN不转换参数;当参数为 aNumber且 is时,它返回 true NaN。那么我应该使用哪一个。
我猜您正在尝试检查该值是否看起来像一个数字。在这种情况下,答案都不是。这些函数检查值是否为IEEE-754 Not A Number。时期。例如,这显然是错误的:
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 aboveRun Code Online (Sandbox Code Playgroud)
还有为什么结果会有如此大的差异。
如上所述,Number.isNaN如果参数不是NumberwhileisNaN首先将值转换为 a ,则将立即返回 false 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
Run Code Online (Sandbox Code Playgroud)
我发现,如果您要检查某件商品是否为数字(或不是),则Number.isNaN()可以使用Number.parseInt()或的组合Number.parseFloat()(取决于您的期望)来涵盖大多数用例:
考虑:针对数个数字测试来测试一堆不同的输入var:
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(',')} );
Run Code Online (Sandbox Code Playgroud)
结果:
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
Run Code Online (Sandbox Code Playgroud)
请注意最后一列,通常这是我根据经验获得的。
| 归档时间: |
|
| 查看次数: |
4479 次 |
| 最近记录: |