NaN (not a number) - 不是一个数字,这种说法不准确。NaN 是一个数字类型,表示的是“在执行数学运算时没有成功,而返回的一个失败的结果”。
var a = 10 * 'str';
console.log(typeof a); // 'number'
在 JavaScript 中,NaN 有一个非常特别的特性,即自身不等于自身。
var a = 10 * 'str';
console.log(a == NaN); // false
console.log(a === NaN); // false
所以,就会有一个常见的问题:如何可靠地测试一个值是否等于 NaN ?
方案一
在 JavaScript 中提供了一个 isNaN()
函数,这个函数接受一个参数(任何类型),然后返回 true/false
来判断这个参数是否是 NaN
。
var a = 10 * 'str';
var b = 'str';
window.isNaN(a); // true
window.isNaN(b); // true
从上面的例子可以看到,isNaN()
有一个缺陷,就是“检查参数是否是 NaN
, 也是否是数字”。
参数 b
的类型是一个字符串类型,却能返回 true
;如果返回 true
,就说明这个参数 b
是 NaN
,即数字类型。矛盾!
方案二
在 ES6 中,新增一个工具函数 Number.isNaN()
。在 ES6 之前的浏览器中的 polyfill 如下:
if(!Number.isNaN){
Number.isNaN = function(n){
return ((typeof n === 'number') && window.isNaN(n));
};
}
// 再来看上面这个例子
var a = 10 * 'str';
var b = 'str';
Number.isNaN(a); // true
Number.isNaN(b); // false
方案三
第三种方法就是利用 NaN
本身的特性,自身不等于自身!
所以,还可以这样检测:
if(!Number.isNaN){
Number.isNaN = function(n){
return n !== n;
};
}
欢迎访问 Leo’s Blog