NaN
是Not-A-Number
的意思
JS有一个特点,其中NaN是唯一不等于自身itself的值。那么我们如何测试呢?最后,ES6介绍,解决这一问题的新方法Object.is
const item = NaN;
// Huh?? this doesn't work
item === NaN; // false
// Yay, this works!
Object.is(item, NaN); // true
您什么时候要检查NaN?
例1:尝试进行数学计算时
一个常见的示例是检查值是否可整除。在此示例中,您无法将其与NaN
进行比较,因为这种比较将始终失败。
const isDivisible = 5 / "Some String";
isDivisible // returns NaN
isDivisible === NaN // returns false
if (isDivisible === NaN) // ❌ so this statement would never work since this will always return false because NaN is never equal to NaN.
示例2:尝试从字符串中提取数字时
同样,如果您尝试NaN
在if
语句中进行测试,则该语句将不起作用,因为条件将始终返回false。
const hasNumber = parseInt("Hello");
hasNumber // returns NaN
hasNumber === NaN // returns false
if(hasNumber === NaN) // ❌ again, you won’t be able to use this logic because this will always return false.
isNaN
可靠吗?
isNaN
实际上不是最好的检查方法NaN
。
“您不认识JS”的作者凯尔·辛普森(Kyle Simpson)提供了一个很好的解释。
这是他的书摘录:
isNaN(..)具有致命缺陷。看起来它试图从字面上理解NaN(“非数字”)的含义-它的工作基本上是:“测试传入的东西不是数字还是数字。” 但这不是很准确。
var a = 2 / 'foo';
var b = 'foo';
a; // NaN
b; // "foo"
window.isNaN(a); // true
window.isNaN(b); // true -- ouch!
显然,“ foo”实际上不是数字,但也绝对不是NaN值!
社区意见
Number.isNaN
或者,您也可以使用Number.isNaN
进行检查。
const item = NaN;
Object.is(item, NaN); // true
Number.isNaN(item); // true
使用Number.isNaN
来检查NaN而不是 Object.is
@_eyalPerry:我认为这Number.isNaN
更适合此用法,因为它不会产生针对各种类型及其边缘情况检查参数的开销。
@_eyalPerry:Object.is
还用于比较对象和函数实例,按值,布尔值等比较字符串(所有这些都在MDN上)。这意味着在后台,它必须进行某种类型检查才能正常工作。这使其成为一种多功能工具。有时-多用工具很好。但是,如果您只是想检查一个值是否为Nan,那么为Object.is付出代价是没有意义的。另外,就个人而言,我喜欢在任何情况下都使用最准确,最准确的方法。在这种情况下-Number.isNaN
就是这样。注意:谨防全局isNaN
功能,请勿使用
有关更多信息 NaN
@RanqueBenoit指出了一些NaN
时髦的特征
const notNumber = 3 * 'str';
notNumber; // NaN
typeof notNumber; // number 🤨
isNaN(notNumber); // true 🤨
“为什么”NaN
不等于NaN
简短内容:根据IEEE 754规范,对NaN值执行的任何操作都应产生错误的值或引发错误。
网友评论