null是显式赋空的原始值,表示“有意设为空”;undefined是系统默认值,表示“尚未赋值”。二者类型不同(null为object,undefined为undefined),==相等但===不等,应用中应依语义分工:参数默认用undefined,属性重置用null,API中null表明确为空,undefined表示缺失。

在JavaScript中,null 和 undefined 都表示“空值”或“无值”,但它们的语义、用途和行为有本质区别。理解二者差异对写出健壮、可维护的代码至关重要。
语义定位不同:主动赋空 vs 未初始化
null 是一个**显式赋值的原始值**,代表“此处本应有值,但我有意设为空”。它是开发者主动选择的结果,语义上接近“空对象引用”或“无对象”。
undefined 是一个**系统默认值**,代表“此处尚未被赋予有效值”——变量声明了但没赋值、函数无返回、对象属性不存在、参数未传入等场景下自动产生。
- let user = null; // 我知道这个用户当前不存在,主动清空
- let name; console.log(name); // undefined —— 声明了,但根本没给值
- function greet() {} console.log(greet()); // undefined —— 函数没 return
类型与比较行为不同:类型严格,相等需谨慎
typeof null === 'object'(历史遗留bug),而 typeof undefined === 'undefined'。
使用 == 时,null == undefined 返回 true(抽象相等规则中二者被特别认定为“相等”);
但用 === 时,null === undefined 为 false(类型不同:null 是 object 类型,undefined 是 undefined 类型)。
- 判断是否“真正无值”,推荐用
value == null(可同时捕获 null 和 undefined) - 若需区分二者(如 API 明确要求 null 表示“清除”,undefined 表示“忽略”),必须用
===单独判断 - 避免直接用
!value判断,因为0、''、false也会为 true —— 容易误判
实际应用中的分工建议
保持语义一致性,能显著提升代码可读性和协作效率:
- 函数参数默认值:用
undefined触发默认逻辑(因未传参时参数值就是 undefined)
function fetch(url, options = {}) { ... } - 对象属性“删除”或“重置”:设为
null表示“存在但值为空”
user.avatar = null; // 头像被移除,但 avatar 字段仍存在 - API 响应字段:后端返回
null表示该字段明确为空;前端收到undefined往往意味着字段缺失或解析失败 - 初始化对象引用:用
null更准确(如let modal = null;),比let modal;(undefined)更能表达“将来会指向某个对象”的意图
检测与处理的最佳实践
不依赖松散比较,也不过度防御。根据上下文选择合适方式:
- 安全取值(可选链):用
obj?.prop?.method()自动跳过 null/undefined,ES2020+ 推荐 - 提供默认值:用空值合并操作符
??(仅当值为 null 或 undefined 时生效)
const name = user.name ?? 'Anonymous'; - 类型检查工具(如 TypeScript)中,可将
null和undefined显式纳入联合类型:string | null | undefined,强制处理所有分支









