JS 中的 NaN !== NaN
在控制台上执行下方代码,不出意外的,结果打印了
NaN "!==" NaN
const param = ‘abc‘
if (parseInt(param) === NaN) {
console.log(parseInt(param), ‘===‘, NaN)
} else {
console.log(parseInt(param), ‘!==‘, NaN)
}
分析
NaN 是怎么出现的
- 数学运算符
在一般数学运算 + - * / 运算符执行过程中,js 会对参与计算的变量进行类型转换,将其转换为
Number
类型,如果转换失败,便会将其赋值为NaN
const a = 111 + ‘a‘
a // NaN
- 强制类型转换
JS 内置的数学方法,都会造成类型转换,比如
parseInt,parseFloat,Number
等,当然parseInt,parseFloat
和Number
的区别在于前者只会将字符串开头的整数或浮点数分解出来,转换为整数或浮点数,后者会转换全部内容
Number(‘111aaa‘)
parseInt(‘aaa111‘)
- 变量声明赋值结果
这个没什么说的,初始化变量就是这
const aaa = NaN
总结
从上面看,得出
NaN
的情况,除声明赋值外,其实是变量类型转换失败的结果。而失败的结果恰恰就是我不知道这个结果是啥,反正不是数字 Not A Number
,所以虽然 Js 数字运算将NaN
赋值给了一个变量或者当成一个结果抛出,但表达的意思其实是描述性的,用于描述aaa
并不是一个数字Not A Number
,那么不等式就有了合理的解释了
const aaa = NaN // 描述性的赋值:‘aaa‘ 不是一个数字
const bbb = NaN // 描述性的赋值:‘bbb‘ 也不是一个数字
// 你没法确定一个非数字是否等于另一个非数字
aaa === bbb // 所以结果就是false了