混淆isNaN和Number.javascript中的isNaN
Confusion between isNaN and Number.isNaN in javascript
我对NaN的工作方式感到困惑。我执行了isNaN(undefined)
,它返回了true
。但是如果我用Number.isNaN(undefined)
,它返回的是false
。那么我应该用哪一个呢?
引用一篇关于ES6中数字的文章:
号码。isNaN几乎与ES5全局isNaN方法相同。号码。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
-
isNaN
将参数转换为Number
,如果结果值为NaN
则返回true。 -
Number.isNaN
不转换参数;当参数为Number
且为NaN
时,返回true。
那我该用哪一个呢
我猜你正试图检查值是否看起来像一个数字。在这种情况下,答案是和。这些函数检查值是否为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 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
我发现,如果你想检查什么是数字(或不是),那么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
注意最后一列,这通常是我的经验。
总之,
isNaN()
例如将检查值到数字(类型)的转换是否失败
'abc '
Number.isNaN()
将检查给定的值类型是否为数字但不是有效的数字
例如:'bb'/33
首先,忘记值NaN
的无用含义,只需将其视为bad number
。一看到NaN
,就把它读成"坏数字"。
Number.isNaN
是isNaN
的一个更安全和健壮的版本,isNaN
有一个bug,
isNaN(NaN) // true, this is the supposed result, the argument is NaN
isNaN('hello') // true, but this is misleading, cuz `hello` is not NaN
isNaN
无法将NaN
与其他非数字值(如字符)区分。
于是一种新的方法开始发挥作用。
号码。isNaN首先检查值是否为数字,如果不是数字,则立即返回false。
Number.isNaN('hello') // false, 'hello' is not NaN, this is the supposed result
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.
global isNaN() function
全局isNaN()函数将测试的值转换为一个Number,然后对其进行测试。
isNaN(123) //false
isNaN('123') //false
isNaN(NaN) //true
isNaN('NaN') //true
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- 可以't让我的if语句处理js中的html表单输入
- 引用对象中的通用值
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 用程序搜索JQuery数据表中的文本
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- 不能从angular2中的子组件指定父组件中的数组
- Dojo不解析自定义小部件的模板html中的小部件声明性
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 正在验证8个真/假复选框或复选框中的2个
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 如何更改bigquery API中的计费层选项
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- Node.js中的Number.isNaN('asd')===false!什么给予
- 简化我的isNaN函数中的两个输入变量JavaScript
- 混淆isNaN和Number.javascript中的isNaN
- 我在这里正确地使用了JavasScript中的isNAN函数吗