js 中 undefined 和 null 的区别

1 阅读2分钟

在 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) → NaN
  • Number(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 是程序员级别的“主动置空”。