在 JavaScript 中,undefined 和 null 都表示“空值”或“没有值”,但它们的类型、含义和用法有本质区别。
1. 类型不同
undefined的类型是"undefined"null的类型是"object"(这是 JS 历史遗留的著名 bug)
javascript
typeof undefined; // "undefined"
typeof null; // "object"
2. 语义与产生方式不同
undefined 表示“变量已声明但未赋值”,或“对象属性不存在”,是一个缺省状态。
常见产生场景:
- 声明变量未初始化
- 访问对象不存在的属性
- 函数没有返回值
- 函数参数未传递实参
javascript
let a;
console.log(a); // undefined
const obj = {};
console.log(obj.x); // undefined
function foo() {}
console.log(foo()); // undefined
function bar(x) { console.log(x); }
bar(); // undefined
null 表示“人为设置的空值”,是一个赋值操作,通常用来主动清空或表示“此处应该有一个对象但目前没有”。
javascript
let data = null; // 明确表示 data 为空对象引用
3. 相等性比较
- 宽松相等 (
==) :undefined == null返回true(两者被认为“同为空值”) - 严格相等 (
===) :undefined === null返回false(类型不同)
javascript
undefined == null // true
undefined === null // false
4. 数值转换不同
Number(undefined)→NaNNumber(null)→0
这在数学运算或隐式转换时会有不同表现。
javascript
undefined + 1 // NaN
null + 1 // 1
5. 是否为全局对象的属性?
undefined在全局作用域中是一个只读属性(ES5 之后),但可在局部被遮蔽。null是一个字面量关键字,不可被覆盖赋值。
javascript
let undefined = 5; // 在函数内可以,但极不推荐
let null = 5; // ❌ SyntaxError
6. 常见使用建议
| 场景 | 推荐使用 |
|---|---|
| 变量声明但未初始化 | undefined(系统默认) |
| 主动清空对象引用 | null |
| 函数参数缺省值检测 | 检查 === undefined |
| 表示对象“空”或“无” | null(便于 typeof 判断预期是对象) |
| JSON 序列化 | null 会被保留,undefined 会被忽略(对象属性)或变成 null(数组元素) |
javascript
JSON.stringify({ a: undefined, b: null }); // '{"b":null}'
JSON.stringify([undefined, null]); // '[null,null]'
总结一句话
undefined是系统级别的“尚未定义”,null是程序员级别的“主动置空”。