undefined表示“未定义”,是变量声明后未赋值等场景下javascript自动赋予的默认空状态;null表示“空值”,是开发者主动赋值以明确标识“此处本该有对象但当前为空”的意图。

区分使用 undefined 和 null,关键不在“能不能用”,而在“该不该用”——前者是语言自动给的“空状态”,后者是你主动设的“空意图”。
看语义:谁在表达“还没来” vs “明确为空”
undefined 表示“本该有值,但还没填”;null 表示“我确认这里不该有值,所以清空它”。
- 变量刚声明、函数没 return、对象缺属性、参数没传——这些都自然得 undefined,你不用写,写了反而多余
- 你想显式释放一个对象引用、初始化一个将来要存对象的变量、API 返回“无数据”时标记空结果——这时用 null 更准确
- 比如:let user = null; 比 let user; 更清晰地传达“我准备放用户对象,但现在确实没有”
看类型判断:别被 typeof 带偏
typeof undefined 返回 "undefined",靠谱;typeof null 却返回 "object"——这是历史 bug,不能信。
- 安全判断 undefined:用 value === undefined 或 typeof value === 'undefined'
- 安全判断 null:必须用 value === null(不能用 typeof)
- 想同时排除两者?用 value == null(利用 == 的宽松相等),但仅限于判空场景
看数值转换:它们对数字运算态度不同
这个差异直接影响逻辑健壮性:
- Number(undefined) → NaN(无法转成有效数字)
- Number(null) → 0(规范明确转为零)
- 所以 undefined + 1 是 NaN,而 null + 1 是 1
- 如果代码里有隐式转换(比如参与加减、比较),混用会悄悄引入错误
看实际场景:什么情况该选哪个
按常见开发动作归类:
- 初始化变量:将来要存对象?用 let item = null;;只是临时占位?留空让 JS 自动给 undefined
- 清空引用:想让对象可被垃圾回收?obj = null;(不是 obj = undefined;)
- 函数返回值:没结果就让它自然返回 undefined;有意表示“查无此物”?return null
- API 接口约定:后端返回缺失字段通常为 null;前端未取到响应数据可能是 undefined(比如请求失败没进 success 回调)











