undefined和null为什么相同

  在 JavaScript 中,undefinednull 它们都表示“没有值”,在某些对比中看起来还“相等”,但它们其实有着完全不同的语义和使用场景。

为什么会有 undefined 和 null?

  • undefined 是 JavaScript 自动赋值的默认状态
  • null 是开发者 主动赋值的空值标志

简单来说,它们都是在告诉你“这里没有东西”,但表达的意思略有不同。

它们到底是什么?

先来看下这两个值的定义:

1
2
typeof undefined // "undefined"
typeof null // "object"
  • undefined:表示变量被声明了但没有赋值,是 JavaScript 默认分配的初始值
  • null:表示一个“空对象指针”,通常是开发者主动赋值来表示“空”或“清空”。

=== 严格比较:类型必须完全一致

当我们写 undefined === null,使用的是严格相等运算符Strict Equality Comparison),规则非常直接:

如果两个值的类型不同,直接返回 false

1
undefined === null // false

所以严格比较下,它们毫无疑问是不相等的。

== 宽松比较:触发抽象相等算法

宽松比较会触发 ECMAScript 规范中的 抽象相等比较算法Abstract Equality Comparison)。

文档地址是:ECMAScript §7.2.14,里面明确写了这个规则。

    1. If x is null and y is undefined, return true.(如果 x 是 null,y 是 undefined,返回 true。)
    1. If x is undefined and y is null, return true.(如果 x 是 undefined,y 是 null,返回 true。)

也就是规范里一开始就规定了: undefined == null → 永远返回 true

这是语言设计者为这两个“空值类型”做的特例处理,因为它们都代表“无”的概念,所以宽松比较时认为它们“相等”。

实际使用

场景 推荐写法 原因
判断空值 x == null 能同时匹配 nullundefined
判断类型精确 x === nullx === undefined 严格控制逻辑
清空变量 x = null 表示有意将值置为空

平时我们都说应该要用 === 而不是 == 进行比较,但是判断是不是空的时候 == 可能会更好用。

小结

undefined 是系统默认的空,null 是人为设定的空;两者在宽松模式规定了是好兄弟,但在严格模式下就六亲不认了。”

作者

Fu9Zhou

发布于

2025-04-11

许可协议