JavaScript 中,value一共有七种type
null,undefined,boolean,number,string,object,symbol(ES6新增),以下为isNaN与Number.isNaN的输出结果:
//isNaN
console.log(isNaN(null)); //false
console.log(isNaN(true)); //false
console.log(isNaN(false)); //false
console.log(isNaN(0)); //false
console.log(isNaN(undefined)); //true
console.log(isNaN("AB")); //true
console.log(isNaN({a: 1})); //true
console.log(isNaN(NaN)); //true
//Number.isNaN
console.log(Number.isNaN(null)); //false
console.log(Number.isNaN(true)); //false
console.log(Number.isNaN(false)); //false
console.log(Number.isNaN(0)); //false
console.log(Number.isNaN(undefined)); //false
console.log(Number.isNaN("AB")); //false
console.log(Number.isNaN({a: 1})); //false
console.log(Number.isNaN(NaN)); //true
console.log(typeof NaN); //number
console.log(NaN == NaN); //false 为什么?
NaN MDN: The global NaN property is a value representing Not-A-Number.
意思是是说:NaN是一个放在 global(浏览器里是window)对象里的一个value,是一个代表Not-A-Number的value.
所以NaN是一个 value, 这个 value 的 type 是 number。
解释来自JavaScript权威指:value, type, variable
值value:就是计算机运行时操作的一些数据对象
数据类型type:就是计算机表示并能操作的值的类型
变量variable:一个值的符号名称,当程序需要将值保存起来备用时,就将值赋给一个变量
即:
variable是存放value的容器,而value是有type概念的,容器variable是没有type的概念的。
example:var ynqc = 'Ella'; 容器 variable ynqc 装着 value 'Ella', value 'Ella' 的type是string
所以,我们用isNaN()来判断一个value是不是NaN了。但是:
isNaN("AB"); // true
isNaN(undefined); // true
isNaN({}); // true
很明显不是 NaN 的 value 也被误判成 NaN 了。
于是 ES6 为了弥补这一BUG引入了 Number.isNaN().
Number.isNaN(NaN); // true
Number.isNaN("AB"); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Number.isNaN() 的 polyfill
if (!Number.isNaN) {
Number.isNaN = function(n) {
return typeof n === "number" && window.isNaN( n );
};
}
简单的实现,利用只有 NaN 不跟自己相等的特性
if (!Number.isNaN) {
Number.isNaN = function(n) {
return return value !== value;
};
}