NaN

224 阅读2分钟

一、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的语法,存在一定的兼容性问题。