如何区分 null 和 undefined?

解释 JavaScript 中 null 和 undefined 的区别,并举例说明它们在不同情况下的行为和使用场景。

JavaScript 中等 基础 数据类型

null 和 undefined 都表示“空值”,但关键差异体现在含义、类型和行为上,以下是主要区别:

  1. 核心定义差异
    • undefined:表示变量未初始化或未定义值,是 JavaScript 赋予的默认状态。典型场景包括:
      • 变量声明后未赋值(如 let a; console.log(a) 输出 undefined)。
      • 访问对象不存在的属性。
      • 函数未提供实参的形参或没有显式返回值。
    • null:表示一个变量被显式设置为空对象引用(人为定义的 “nothing”),用于清空值或释放内存。典型场景包括:
      • 初始化对象为空引用(如 let user = null)。
      • 作为函数参数表示无有效对象输入或对象生命周期结束时的回收。
  2. 类型检查与操作行为差异
    • typeof 检测结果
      • typeof undefined 返回 "undefined"
      • typeof null 异常返回 "object",这是 JavaScript 早期设计遗留问题(二进制机制误判),非实际对象类型。
    • 宽松相等 (==) 与严格相等 (===)
      • null == undefinedtrue(抽象比较时类型自动转换)。
      • null === undefinedfalse(二者类型不同:Null 和 Undefined)。
    • 数值转换行为
      • Number(null) 结果为 0(可作为数字计算)。
      • Number(undefined) 结果为 NaN(非数字值,计算时报错)。
        console.log(10 + null);      // 10(null→0)
        console.log(10 + undefined); // NaN(undefined→NaN)
        
  3. 语义和编码实践
    • 编程中应避免混淆
      • 使用 === 严格相等区分二者(例:if (value === null) 检测设空值)。
      • undefined 表示“未定义状态”(自然存在),null 表示“未定义状态”(需显式赋值)。
    • 二者均为 falsy 值:在布尔上下文(如 if (value))中均转为 false
  4. 用法原则总结
    • 优先用 undefined 保持语言默认行为(例:函数未返回时为自动结果)。
    • 在需要控制资源释放(如清空对象引用以触发垃圾回收)时,显式赋值 null