null 表示主动赋空,是明确的空对象引用;undefined 表示尚未赋值,是变量未初始化等自然状态。两者类型不同(null 为 "object",undefined 为 "undefined"),== 相等但 === 不等,检测时应分别用 === null 和 typeof === 'undefined'。

在 JavaScript 中,null 和 undefined 都表示“空值”或“无值”,但它们的语义、类型、产生时机和使用意图完全不同——这不是设计冗余,而是有意区分“主动赋空”与“尚未赋值”两种状态。
类型与本质差异
null 是一个原始值(primitive value),其类型是 "object"(这是历史遗留 bug,但已成规范,无法更改)。它被设计为一个**有意的、明确的空对象引用**,代表“这里本应有对象,但现在为空”。
undefined 也是原始值,类型是 "undefined",表示“值未被定义”——变量声明了但没赋值、函数无返回、对象属性不存在、参数未传入等场景下自然出现。
常见产生方式对比
-
null:只能显式赋值,如
let a = null;、document.getElementById('xxx')找不到元素时返回null、JSON.parse(null)返回null -
undefined:自动产生,如
let b;(声明未初始化)、function f(){}; f()(无 return)、obj.missingProp(访问不存在属性)、function g(x) { return x; }; g()(调用时漏传参)
判断与比较注意事项
两者在松散相等(==)下互相相等:null == undefined 为 true;但在严格相等(===)下不等:null === undefined 为 false。
更安全的检测方式是:
- 检查是否为
undefined:用typeof x === 'undefined'或x === undefined(需确保undefined未被重写) - 检查是否为
null:必须用x === null(因为typeof null === 'object'会误导) - 若需同时处理两者(如默认值逻辑),可用
x == null或更现代的空值合并操作符x ?? defaultValue
推荐使用场景
null 应用于:需要明确表示“此处本该有值,但当前主动置为空”的情况。例如 API 返回中某个可选字段确实不存在(不是缺失,而是业务上为空),DOM 操作失败结果,或作为对象属性的“清空占位符”。
undefined 应保留在运行时自然状态中,不要手动赋值。避免写 let x = undefined;,这既冗余又易混淆;应直接用 let x; 或让其自然产生。函数参数默认值、对象解构默认值等场景,也优先用 ?? 或 ||(注意后者对 falsy 值敏感)来兜底。










