undefined 表示“未初始化”,是引擎自动赋予的默认值;null 表示“主动清空”,是开发者明确赋的空值。二者语义、来源、用法、类型及比较行为均不同,开发中应按意图区分使用。
简单说:undefined 是“还没给值”,null 是“我主动清空了”。它们语义不同、来源不同、用法也不同。
undefined 是 JavaScript 引擎自动给的默认状态,代表“未初始化”或“不存在”:
let x; → x 就是 undefined
return,返回值就是 undefined
{name: 'A'}.age → undefined
undefined
null 是开发者主动写的,代表“这里本该有值,但我明确让它为空”:
data = null; 帮助垃圾回收let currentUser = null;
null 表示“没查到”,而不是让调用方猜是不是出错了document.getElementById('xxx') 找不到就返回 null
typeof undefined 返回 "undefined";typeof null 却返回 "object"——这是历史遗留 bug,但已成规范,别被误导。
比较时:
null == undefined 是 true(双等会做类型转换)null === undefined 是 false(严格相等看类型也看值)!null 和 !undefined 都是 true(在 if 判断里都转为 false)Number(null) 是 0,Number(undefined) 是 NaN
用 undefined 的情况,基本都是你“没动它”,系统自动填的:
undefined
obj.prop === undefined 或更稳妥的 Object.hasOwn(obj, 'prop')
用 null 的情况,是你“主动干预”,想表达一种明确意图:
null 表示“查无此物”,而 undefined 更适合表示“字段压根没定义”let selectedItem = null; 比 let selectedItem; 更清晰表明“初始无选择”string | null,就明确告诉别人这个值可能是空,不是忘了赋值别手动给变量赋 undefined,这容易让人困惑——它本该是“系统默认”,你一写反而像 bug。真要清空,就用 null。
判断是否“空”时,优先用严格相等:
value === undefined
value === null
value == null(等价于 value === null || value === undefined),简洁且安全现代 JS 和 TypeScript 越来越倾向把 null 当作可控的空状态,把 undefined 留给系统行为——这样代码意图更干净,协作也更省心。