typeof NaN 返回结果为number,NaN的类型为number,所有当NaN == NaN返回false时会给人留下很多疑惑。
NaN是Not a Number,不是一个数值的缩写。一些数学运算会产生不可表达的值,即NaN。 NaN更多的是表示不是一个数值的状态,而不是一个数值的状态有很多种情况。
如果A为NaN,B为NaN,也就是说A不是一个数值,B也不是一个数值。比如‘abc’,‘efg’都不为一个数值,你能说它们相等吗?当然不能。这样来理解NaN == NaN返回false,就更容易理解了。更俗一点的理解:你是人,他是人,你们都不是数值,但你和他能相等么?
判断一个值是不是数值有两种判断方法:
1、全局的isNaN
全案的isNaN会将一个值试图转换为number(使用Number(value)转换),如果转换的结果为NaN,则返回true,否则返回false。
一些空字符串、布尔值会经过Number(value)转换为0、1,所有也会返回false。
Date对象经过Number(value)转换为时间戳number,
isNaN(1) //false
isNaN('1') //false
isNaN('') //false
isNaN(' ') //false
isNaN(true) //false
isNaN(null) //false
isNaN(new Date()) //false
isNaN(undefined) //true
isNaN(new Object()) //true
isNaN('abc') //true
isNaN(NaN) //true
polyfill对isNaN的实现(更易于理解isNaN的原理):
const isNaN = function(value) {
const n = Number(value);
return n !== n;
};
2、Number.isNaN
Number.isNaN也可用于判断一个值是否为NaN,但该方法不会进行自动的值转换。Number.isNaN是用于判断一个值类型为number,并且为NaN。
isNaN(1) //false
isNaN('1') //false
isNaN('') //false
isNaN(' ') //false
isNaN(true) //false
isNaN(null) //false
isNaN(new Date()) //false
isNaN(undefined) //false
isNaN(new Object()) //false
isNaN('abc') //false
isNaN(NaN) //true
polyfill对Number.isNaN的实现:
Number.isNaN = Number.isNaN || function isNaN(input) {
return typeof input === 'number' && input !== input;
}
总结:1、要粗略的判断一个value是否为NaN,即是否能通过Number(value)转换为number的,使用全局isNaN进行判断;2、要判断一个value是否就是NaN精确的判断,使用Number.isNaN判断。3、一般情况推荐使用Number.isNaN进行判断,isNaN判断可能会返回意想不到的结果。