首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript中isNaN和Number.isNaN的混淆

javascript中isNaN和Number.isNaN的混淆
EN

Stack Overflow用户
提问于 2015-10-16 15:24:16
回答 5查看 18.7K关注 0票数 57

我对NaN的工作原理感到困惑。我已经执行了返回trueisNaN(undefined)。但是如果我要使用Number.isNaN(undefined),它会返回false。那么我应该用哪一个呢?还有为什么在结果中会有如此大的差异。

EN

回答 5

Stack Overflow用户

发布于 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

示例:

代码语言:javascript
复制
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
票数 60
EN

Stack Overflow用户

发布于 2015-10-16 16:04:48

如果结果值为NaN.

,并返回Number;如果参数为Number且为true,则返回true

,所以我应该使用哪一个。

我猜您正在尝试检查该值是否为看起来像数字的值。在这种情况下,答案既不是,也不是。这些函数检查该值是否为IEEE-754而不是A数字。句号。例如,这显然是错误的:

代码语言:javascript
复制
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

也解释了为什么结果会有如此大的差异。

如上所述,如果参数不是NumberNumber.isNaN将立即返回false,而isNaN首先将值转换为Number。这会改变结果。下面是一些例子:

代码语言:javascript
复制
                |       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
票数 21
EN

Stack Overflow用户

发布于 2017-05-31 22:39:45

我发现,如果你想检查某个东西是不是数字,那么结合使用Number.isNaN()Number.parseInt()Number.parseFloat() (取决于你的期望)就可以覆盖大多数用例:

考虑:针对几个is编号测试测试一组不同的输入变量:

代码语言:javascript
复制
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(',')} );

结果:

代码语言:javascript
复制
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

请注意最后一列,这通常是我在经验中想要的。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33164725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档