应优先用 null 显式表示“有意为空”,用默认值初始化对象和参数,必要时用 Symbol 区分未设置/清空/设为 undefined,用 void 0 替代 undefined 防重写。

直接用 undefined 赋值不是错误,但容易引发歧义和隐患——它既可能表示“还没设值”,也可能被误读为“出错了”。更稳妥的做法是明确语义、控制传播、预留扩展空间。
用 null 显式表达“有意为空”
当某个属性本应存在、但当前确实没有有效值(比如用户头像暂未上传、API 返回字段缺失且明确不提供),用 null 比 undefined 更清晰:
-
null是开发者主动设定的,语义是“这里本该有东西,但现在没有” - 它不会被可选链(
?.)或空值合并(??)意外吞掉——obj.avatar ?? 'default.jpg'会保留null,而obj.avatar ?? 'default.jpg'对undefined会立即兜底 - 后端接口若约定“缺失字段返回
null”,前端保持一致能减少判断分支
用默认值初始化对象结构
声明对象时就填好常见字段,避免运行时突然冒出 undefined:
const user = { name: '', email: '', avatar: null, settings: {} };- 函数参数加默认值:
function createUser({ name = '', role = 'guest', permissions = [] } = {}) { ... } - 数组或对象字段不依赖“首次访问才创建”,而是提前初始化,比如
items: []而非留空
用 Symbol 作占位标识(进阶场景)
当需要区分“从未设置”“设过但清空了”“设过 undefined”三种状态时,undefined 和 null 都不够精确。可用唯一 Symbol:
立即学习“Java免费学习笔记(深入)”;
const UNSET = Symbol('unset');const config = { timeout: UNSET };- 后续通过
config.timeout === UNSET精确判断是否初始化,不会和真实值冲突 - 适合配置管理、缓存标记、状态机等对赋值历史敏感的场景
用 void 0 替代字面量 undefined(兼容性与安全性)
虽然现代环境已锁定全局 undefined,但在老旧代码或局部作用域中仍可能被重写。用 void 0 更可靠:
-
obj.status = void 0;—— 确保赋的是真·原始 undefined,不受变量遮蔽影响 - 比
obj.status = undefined多一字符,但杜绝了var undefined = 'oops';类型风险 - 工具链(如 TypeScript、ESLint)通常也推荐此写法,尤其在库代码中


















