面试题:JavaScript 中 null 和 undefined 的区别是什么?

nullundefined 都表示“无”或“空值”,但在 JavaScript 中有明确的区别。理解它们的不同是掌握 JavaScript 类型系统的关键。


一、核心区别总结

特性undefinednull
含义“未定义” —— 变量声明了但没有赋值“空值” —— 明确表示“无”或“空对象指针”
类型undefinedobject(历史 bug)
赋值方式自动赋值(默认值)必须显式赋值
使用场景系统默认的“无值”状态开发者主动表示“无值”
typeof"undefined""object" ⚠️(bug)

二、详细解释

1. undefined

  • 含义:表示一个变量已声明但未初始化,或者对象属性、函数参数不存在。
  • 产生场景
  // 变量声明但未赋值
  let name;
  console.log(name); // undefined

  // 对象没有某个属性
  const obj = {};
  console.log(obj.age); // undefined

  // 函数参数未传
  function greet(name) {
    console.log(name); // undefined
  }
  greet(); // 没传参数

  // 函数没有返回值
  function doNothing() {}
  console.log(doNothing()); // undefined
  • 类型undefined 是其自身的类型,typeof undefined === "undefined"

2. null

  • 含义:表示一个有意的“空值”或“无对象”。它是开发者主动赋值来表示“这里没有值”。
  • 产生场景
  // 明确表示一个变量现在“无值”
  let user = { name: "Alice" };
  user = null; // 表示 user 当前不指向任何对象

  // DOM 查询未找到元素
  const element = document.getElementById("not-exist");
  console.log(element); // null

  // 初始化一个可能后续赋值的对象
  let data = null;
  • 类型typeof null === "object",这是一个历史遗留 bug(早期 JavaScript 实现错误),但为了兼容性被保留。

三、比较行为(== vs ===

  • null == undefinedtrue
    == 下,它们被认为是“相等”的(类型转换规则)。
  • null === undefinedfalse
    === 下,类型不同,不相等。
if (value == null) {
  // 匹配 null 和 undefined(常用技巧)
}

四、实际开发中的使用建议

场景推荐使用
变量声明后暂时无值let x;(即 undefined
主动清空变量或对象引用x = null;
函数返回“无结果”通常返回 null(如 document.getElementById()
初始化可能为对象的变量let obj = null;
检查变量是否为 nullundefinedvalue == nullvalue === null || value === undefined

五、如何检查 nullundefined

  1. 分别检查
   if (value === null) { /* 是 null */ }
   if (value === undefined) { /* 是 undefined */ }
  1. 同时检查两者(常用):
   if (value == null) { /* 是 null 或 undefined */ }
  1. 安全检查未声明变量
   if (typeof someVar === "undefined") { /* 安全!即使变量未声明 */ }

六、总结

问题回答
undefined 是什么?表示“未定义”,是变量声明后未赋值的默认值,由系统自动赋予。
null 是什么?表示“空值”,是开发者主动赋值来表示“无对象”或“无值”。
核心区别undefined 是系统默认的“无”,null 是程序员主动设置的“无”。
如何比较?null == undefinedtruenull === undefinedfalse
最佳实践null 表示“有意为空”,用 undefined 表示“未初始化”;检查时可用 value == null 同时匹配两者。

一句话undefined 是“还没有值”,null 是“我已经清空了值”。

THE END
喜欢就支持一下吧
点赞11 分享