null代表主动设为空,undefined代表未赋值;null是手动赋值的语义化空值,undefined是JS引擎自动补位的缺失状态;判断时用===区分,==null可同时捕获两者。

区分 null 和 undefined 的关键不在“怎么判断”,而在于理解它们代表的两种不同状态:一个是“我主动清空了”,一个是“它根本没被设置过”。这种语义差异直接决定了你该用哪种判断方式、在什么场景下赋哪个值。
看来源:谁给的这个“空”?
undefined 是 JavaScript 引擎自动填的——你声明了一个变量但没赋值,访问对象里不存在的属性,函数没写 return,参数没传进来……这些情况下出现的 undefined,都是语言自动补位的结果,不是你写的。
null 是你亲手写的——比如初始化一个将来要存用户的变量:let currentUser = null;或者查询失败后明确返回 return null;又或者手动释放大对象引用:data = null。它代表一种有意识的、可读性强的“空”。
看类型和比较:别被 typeof 带偏
typeof undefined 返回 "undefined",准确反映它的身份;typeof null 却返回 "object",这是历史遗留 bug,不能信。真正靠谱的判断方式是:
立即学习“Java免费学习笔记(深入)”;
- 检查是否未赋值(自然缺失):value === undefined
- 检查是否被主动设为空:value === null
- 检查是否属于“空值范畴”(两者都算):value == null(简洁且安全)
看数值转换:行为截然不同
它们在参与运算时暴露本质差异:
- null + 1 得 1(因为 Number(null) === 0)
- undefined + 1 得 NaN(因为 Number(undefined) === NaN)
- !null 和 !undefined 都是 true,所以 if 判断里都进 false 分支,但这不等于它们等价
看实际用法:按意图选,别随便混用
写代码时记住这个动作逻辑:
- 函数参数缺省、对象属性不存在、变量只声明不赋值 → 放心让它是 undefined,不用管
- 想表示“这里本该有东西,但我确认没有” → 主动赋 null
- API 接口字段明确无数据 → 后端应返回 null;字段压根没出现在响应里 → 前端拿到的是 undefined
- 别手动写 let x = undefined,这就像给系统默认值盖章,反而让人怀疑是不是写错了


















