面试题:
- 什么是NaN: 不是数值
- 怎么判断NaN:isNaN(), Number.isNaN(), Object.is();
- ===全等于号可以判断NaN吗? 不可以,因为NaN不等于自身
1. NaN详解:
- 定义:not a number 一个不是数字的值
- 他是Number类型的一个特殊成员,所以 检测类型的结果是number:
typeof NaN ==> 'number' - 声明的时候可以使用
var a = NaN; 或者 a = Number.NaN; 因为NaN是Number的一个属性
1.1 产生NaN的常见场景:
通常在【数学运算 无法产生有效数字 结果】时产生
- 无效的数学运算:
0/0;Math.sqrt(-1); ==> NaN - 将非数字字符串转换为数字:
- 直接方法转换:
parseInt('abc'); Number('abc');Number(undefind)=> NaN - 隐式转换:
"abc"-10=> NaN;
- 直接方法转换:
- 所有涉及NaN的数学运算如:
NaN+1=> NaN
检测NaN的方法(重要!!!)
不能使用=== 或者== 来检测NaN,因为NaN不等于任何值 包括他自身;
- isNaN 全局方法:会将非数字先转成数字,在判断, 会有误差;如isNaN('NaN')
- Number.isNaN(NaN): ES6 引入的 参数类型不是
NaN,Number.isNaN一律返回false - Object.is(NaN,NaN) : 和全等行为的区别就是,可以准确判断NaN 和 +0-0
问题1: isNaN() 和Number.isNaN() 的区别就是:
isNaN【会调用Number() 将非数值的值转为数值】
容易对非数字产生误判如:isNaN('NaN') ===> true
问题2: 最准确的检测,如果传入的参数不是NaN,一律返回false
问题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对象上面
目的: 逐步减少全局性方法,使得语言逐步模块化