面试题:怎么判断NaN

224 阅读2分钟

面试题:

  1. 什么是NaN: 不是数值
  2. 怎么判断NaN:isNaN(), Number.isNaN(), Object.is();
  3. ===全等于号可以判断NaN吗? 不可以,因为NaN不等于自身

1. NaN详解:

  • 定义:not a number 一个不是数字的值
  • 他是Number类型的一个特殊成员,所以 检测类型的结果是number:typeof NaN ==> 'number'
  • 声明的时候可以使用 var a = NaN; 或者 a = Number.NaN; 因为NaN是Number的一个属性

1.1 产生NaN的常见场景:

通常在【数学运算 无法产生有效数字 结果】时产生

  1. 无效的数学运算:0/0 ; Math.sqrt(-1); ==> NaN
  2. 非数字字符串转换为数字
    • 直接方法转换:parseInt('abc'); Number('abc');Number(undefind) => NaN
    • 隐式转换:"abc"-10 => NaN;
  3. 所有涉及NaN的数学运算如: NaN+1 => NaN

检测NaN的方法(重要!!!)

不能使用=== 或者== 来检测NaN,因为NaN不等于任何值 包括他自身;

  1. isNaN 全局方法:会将非数字先转成数字,在判断, 会有误差;如isNaN('NaN')
  2. Number.isNaN(NaN): ES6 引入的 参数类型不是NaNNumber.isNaN一律返回false
  3. Object.is(NaN,NaN) : 和全等行为的区别就是,可以准确判断NaN 和 +0-0

问题1: isNaN() 和Number.isNaN() 的区别就是:

isNaN【会调用Number() 将非数值的值转为数值

容易对非数字产生误判如:isNaN('NaN') ===> true

问题2: 最准确的检测,如果传入的参数不是NaN,一律返回false

image.png

问题3: === 不能判断NaN, object.is()可以

  • 因为NaN 不等于自身
  • Object.is()和全等只有2个行为不一致:NaN可以等于NaN, +0 和-0 不相等;
NaN === NaN;  // false
Object.is(NaN, NaN); // true

// ----
+0 === -0 // true
Object.is(+0,-0) // false

问题4: 为什么要将全局方法移植到Number对象上面

目的: 逐步减少全局性方法,使得语言逐步模块化