应优先使用 ??、?. 和 ??= 处理空值:?? 仅在 null/undefined 时提供默认值,避免误覆 0/''/false;?. 安全访问嵌套属性;??= 简洁初始化变量或属性。

JS 中空值处理的现代语法建议,核心是用对 ??、?. 和 ??= 这三个操作符,而不是继续依赖 || 或冗长的三元判断。它们分工明确:?? 专管 null/undefined 的默认值兜底,?. 安全访问嵌套属性,??= 简洁初始化或补缺。
只在真正缺失时才用默认值:用 ?? 替代 ||
|| 会把 0、''、false 都当成“假”而触发默认值,但这些可能是合法业务值。比如用户输入商品数量为 0,或昵称留空,都不该被覆盖。
- ✅ 正确:const count = userInput ?? 1; —— 只有 userInput 是 null 或 undefined 时才用 1
- ❌ 错误:const count = userInput || 1; —— userInput 为 0 也会变成 1,逻辑错位
- 注意:?? 不能省略左侧表达式,且不支持与 &&、|| 直接混用(需加括号)
安全读取深层属性:用 ?. 避免报错
访问 user.profile.avatar.url 这类链式属性时,中间任一环节为 null/undefined 就会报错。?. 让每一步都“可选”,出问题就短路返回 undefined,不中断执行。
基于三引擎设计,从微信文章、新闻和博客网页提取干净内容,支持标题作者日期元数据,多格式和批量处理。
- ✅ const avatar = user?.profile?.avatar?.url;
- ✅ 可配合 ?? 使用:const avatar = user?.profile?.avatar?.url ?? '/default.png';
- ⚠️ 注意:?. 只适用于属性访问、方法调用和数组索引,不能用于赋值或声明
简洁初始化变量或属性:用 ??= 赋值更干净
当变量可能未定义,又想设个默认值时,不用写 if 判断或重复变量名。
- ✅ let name; name ??= 'Anonymous'; —— name 为空才赋值
- ✅ const config = {}; config.timeout ??= 5000;
- ✅ 等价于 config.timeout = config.timeout ?? 5000;
空字符串、0、false 不等于“空”:区分语义很关键
null 和 undefined 表示“值不存在”;而 0、''、false 是“值存在,只是恰好为假”。业务上常需保留后者 —— 比如库存为 0、开关关闭、用户名为空字符串,都是有效状态。
- 用 ?? 就是尊重这种语义区分
- 若真需要过滤所有假值(含 0 和 ''),仍可用 ||,但得确认这是业务本意,而非误判










