前端学习之路 isNaN也是个bug?

607 阅读1分钟

NaN

全局属性NaN,一个不是数字的数字;可能比较难以理解,可以将其理解为“无效的数值”;


为什么说NaN是一个不是数字的数字?

typeof NaN === 'number'; // true

NaN用来表示失败的数学运算;

let a = 1 / 'foo';
console.log(a); // NaN
typeof a  === 'number'; // true


如何检测NaN?

  • NaN不等于自身,NaN是JavaScript中唯一一个不等于自身的值;

let a = NaN;
a == NaN; // false
a === NaN; // false

  • isNaN意外的问题;

let a = 2 / 'foo';
isNaN(a); // true
a = 'foo';
isNaN(a); // true => what

  • 非数字类型使用isNaN时,JavaScript会默认先将其转换为数字类型,再使用isNaN检验;

let a = '123';
isNaN(a); // Number(a) => 123 => isNaN(a) => false
a = 'hi';
isNaN(a); // Number(a) => NaN => isNaN(a) => true

  • 正确的方式(NaN是JavaScript中唯一一个不等于自身的值);

window.isNaN = function (n) {
    return n !== n;
}