null 与 undefined 的区别
JavaScript 中 null 和 undefined 的区别及使用场景
问题
说明 JavaScript 中 null 和 undefined 的区别。
解答
语义区别
// 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'是历史 bugnull == undefined为true,严格相等为false- 数值转换:
undefined→NaN,null→0 - 函数默认参数只对
undefined生效,null不触发
目录