一、NaN 意指“不是一个数字”(not a number)
NaN 是一个“警戒值”(sentinel value,有特殊用途的常规值),用于指出数字类型中的错误情况,即“
执行数学运算没有成功,这是失败后返回的结果”。
console.log('12a' * 1); // NaN
console.log('a12' * 1); // NaN
console.log(undefined * 1); // NaN
console.log((() => {}) * 1); // NaN
console.log({} * 1); // NaN
- !!!NaN与任何数字类型的值(包括NaN)做任何运算结果都是NaN
- NaN与字符串做加法运算和数字与字符串做加法运算规则一样(拼串)
二、特点
1、NaN类型是数字类型的
虽然名字是“不是一个数字”,但其类型仍然是一个数字
console.log(typeof NaN);// number
console.log(Object.prototype.toString.call(NaN));// [object Number]
2、我不等于我自己
NaN !== NaN (拓展:0 和 -0)
console.log(NaN !== NaN); // true
console.log(NaN != NaN); // true
// !!! 区别
console.log(0 == -0); // true
console.log(0 !== -0); // false
Objcet.is() ES6标准新增方法,用于判断两个值是否属于同一个值,其能准确的判断
NaN。
console.log(Object.is(NaN, NaN));// true
console.log(Object.is(123, NaN));// false
三、判断一个变量是否为NaN
1、isNaN() 是一个全局方法(会进行类型转换)
- 本质是检查一个值转换为数字后的返回值是否为NaN,是就返回true,反之为false
- 任何不能转换为数值的值也都会返回true
console.log(isNaN(undefined)); // true 转数字为NaN
console.log(isNaN({})); // true 转数字为NaN
console.log(isNaN(NaN)); // true
console.log(isNaN('')); // false 转数字为0
console.log(isNaN(null)); // false 转数字为0
console.log(isNaN(1)); // false 转数字为1
2、Number.isNaN() (不会进行类型转换)
判断一个值是否为数字,并且值为NaN
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(undefined)); // false
console.log(Number.isNaN({})); // false
console.log(Number.isNaN('')); // false
console.log(Number.isNaN(null)); // false
console.log(Number.isNaN(1)); // false
3、isNaN和Number.isNaN的区别
- Number.isNaN()是严格判断, 必须严格等于
NaN。 - isNaN()是通过值内部的 toNumber 转换的结果来判定的,即先转成数值后的返回值
- Number.isNaN()是ES6的语法,存在一定的兼容性问题。