undefined和null为什么相同
在 JavaScript 中,undefined
和 null
它们都表示“没有值”,在某些对比中看起来还“相等”,但它们其实有着完全不同的语义和使用场景。
为什么会有 undefined 和 null?
undefined
是 JavaScript 自动赋值的默认状态。null
是开发者 主动赋值的空值标志。
简单来说,它们都是在告诉你“这里没有东西”,但表达的意思略有不同。
它们到底是什么?
先来看下这两个值的定义:
1 | typeof undefined // "undefined" |
undefined
:表示变量被声明了但没有赋值,是 JavaScript 默认分配的初始值。null
:表示一个“空对象指针”,通常是开发者主动赋值来表示“空”或“清空”。
===
严格比较:类型必须完全一致
当我们写 undefined === null
,使用的是严格相等运算符(Strict Equality Comparison
),规则非常直接:
如果两个值的类型不同,直接返回
false
。
1 | undefined === null // false |
所以严格比较下,它们毫无疑问是不相等的。
==
宽松比较:触发抽象相等算法
宽松比较会触发 ECMAScript 规范中的 抽象相等比较算法(Abstract Equality Comparison
)。
文档地址是:ECMAScript §7.2.14,里面明确写了这个规则。
- If x is null and y is undefined, return true.(如果 x 是 null,y 是 undefined,返回 true。)
- If x is undefined and y is null, return true.(如果 x 是 undefined,y 是 null,返回 true。)
也就是规范里一开始就规定了: undefined == null
→ 永远返回 true
。
这是语言设计者为这两个“空值类型”做的特例处理,因为它们都代表“无”的概念,所以宽松比较时认为它们“相等”。
实际使用
场景 | 推荐写法 | 原因 |
---|---|---|
判断空值 | x == null |
能同时匹配 null 和 undefined |
判断类型精确 | x === null 或 x === undefined |
严格控制逻辑 |
清空变量 | x = null |
表示有意将值置为空 |
平时我们都说应该要用 ===
而不是 ==
进行比较,但是判断是不是空的时候 ==
可能会更好用。
小结
“undefined
是系统默认的空,null
是人为设定的空;两者在宽松模式规定了是好兄弟,但在严格模式下就六亲不认了。”
undefined和null为什么相同