关于NaN
,null
,undefined
的个人理解
1. NaN
非数值(Not a Number)
非数值在JS中有一个不同寻常的特性: 它与任何值都不相等,也不等于自己,这意味着不可以通过x === NaN
判断变量x的值是NaN
.要想判断就需要写成x != x
或者 Number.isNaN(x)
NaN === NaN // false
NaN === false // false
Number.isNaN(NaN) // true
isNaN(NaN) // true
2. null
和undefined
undefined
表示一种系统级别,意料之外或类似错误的没有值
null
表示程序级别,正常或意料之中的没有值
null
是一个语言关键字,求值为一个特殊值,通常用于表示某个值不存在. 对null
使用typeof
操作符会返回字符串'object'
,表示可以将null
看成一个特殊的对象,表示没有对象
undefined
也表示值不存在,但是undefined
表示一种更加深层次的不存在,具体来说,
- 变量的值未初始化的时候就是
undefined
, - 在查询不存在的对象属性或者数组元素的时候也会得到
undefined
; - 没有明确返回值的函数返回的也是
undefined
, - 没有传值的函数参数的值也是
undefined
,
对undefined
应用typeof
操作符会返回undefined
可以使用Object.prototype.toString.call()
判断两者
Object.prototype.toString.call(null) // '[object Null]'
Object.prototype.toString.call(undefined) // '[object Undefined]'
3. 0
和Infinity
负零值和正零值相等,就算是在JS的严格模式下面比较也相等,这意味着除了作为除数使用,几乎无法区别这两个值, 主要因为Infinity
和-Infinity
不相等
let zero = 0
let negz = -0
zero === negz // true
1/zero === 1/negz // false
4. 注意一些运算操作,面试可能会出现
1 + null // 1
1 + NaN // NaN
1 + undefined // NaN
1 / null // Infinity
1 / 0 // Infinity
1 / Infinity // 0
具体原因是因为类型转换