Undefined 和 null 虽都表示“空”,但语义不同:undefined 是引擎自动产生的未初始化状态,null 是开发者显式设置的有意为空;判断用 ===,避免 ==;初始化对象变量推荐 null,函数查无结果返回 null,属性不存在返回 undefined。

Undefined 和 Null 都是 JavaScript 的原始类型,都表示“空”,但语义和使用意图完全不同:undefined 是系统默认的“未初始化”状态,null 是开发者主动设置的“有意为空”。
语义与来源的区别
undefined 出现在变量声明后未赋值、函数无 return、访问对象不存在的属性、参数未传入等场景——它由引擎自动产生,代表“还没给值”。
例如:let x; console.log(x); // undefined
null 只能由开发者显式写入,用于表达“本该有值,但我明确清空了”。
例如:let user = null; // 初始无用户,不是忘了赋,而是刻意留空
- undefined 是被动的、自然的缺失;null 是主动的、人为的标记
- 引擎永远不会自动把变量设为 null;但会频繁生成 undefined
- 在类型系统中,null 更接近“空对象引用”,而 undefined 更接近“未定义的占位符”
判断方式要准确可靠
用 === 是最直接的区分方式:value === undefined 或 value === null。不要依赖 ==,因为 null == undefined 返回 true,容易掩盖逻辑问题。
检测未声明变量或可能不存在的全局属性时,必须用 typeof value === 'undefined',否则直接访问会报 ReferenceError。
- 检查 null:直接 value === null(安全、高效)
- 检查 undefined:优先用 value === undefined;若担心被局部变量覆盖,改用 typeof value === 'undefined'
- 避免 value == null 这种写法——它同时匹配 null 和 undefined,模糊了语义意图
实际使用中的推荐习惯
初始化将来会存对象的变量,用 let item = null,比 let item 更清晰地表明“此处预留对象位置,当前为空”。
函数返回值设计上:查不到结果时返回 null(如 document.getElementById()),字段压根没定义时让调用方拿到 undefined(如 obj.missingProp)。
- 永远不要写 x = undefined —— 这既无必要,又引发语义混淆
- 需要重置对象引用、释放内存时,用 obj = null
- TypeScript 中,string | null 明确表示“可为空”,而 string | undefined 常用于可选参数或未初始化字段
其他关键行为差异
typeof null 返回 'object' 是历史 bug,但已成规范,别被误导;typeof undefined 返回 'undefined' 是准确的。
JSON 序列化时:undefined 字段会被完全剔除,null 会被保留为 null 值。
数字转换时:Number(null) === 0,Number(undefined) === NaN —— 这个差异极易引发隐性计算错误。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











