null 与 undefined 的区别

JavaScript 中 null 和 undefined 的区别及使用场景

问题

说明 JavaScript 中 nullundefined 的区别。

解答

语义区别

// undefined:变量已声明但未赋值
let a;
console.log(a); // undefined

// null:主动赋值为空
let b = null;
console.log(b); // null

类型区别

typeof undefined; // 'undefined'
typeof null;      // 'object' (历史遗留 bug)

// 正确判断 null
Object.prototype.toString.call(null); // '[object Null]'

相等性比较

null == undefined;  // true (宽松相等)
null === undefined; // false (严格相等)

// 只有 null 和 undefined 互相宽松相等
null == 0;         // false
undefined == 0;    // false

数值转换

Number(undefined); // NaN
Number(null);      // 0

// 运算中的表现
undefined + 1; // NaN
null + 1;      // 1

默认值场景

// 函数参数默认值:只有 undefined 触发
function greet(name = 'Guest') {
  console.log(name);
}

greet(undefined); // 'Guest'
greet(null);      // null

// 可选链与空值合并
const obj = { a: null };

obj.a ?? 'default';        // null (?? 只处理 null/undefined)
obj.b ?? 'default';        // 'default'
obj.a || 'default';        // 'default' (|| 处理所有假值)

使用场景

// undefined:系统级别的"未定义"
let x;                    // 未赋值
function fn() {}          // 无返回值
const obj = {};
obj.prop;                 // 访问不存在的属性

// null:开发者主动设置的"空值"
let cache = null;         // 初始化为空
element.onclick = null;   // 清除事件
const result = null;      // 表示无结果

关键点

  • undefined 表示未定义,null 表示主动设置的空值
  • typeof null 返回 'object' 是历史 bug
  • null == undefinedtrue,严格相等为 false
  • 数值转换:undefinedNaNnull0
  • 函数默认参数只对 undefined 生效,null 不触发