文档概述
// 基础语法
const result = leftExpression ?? rightExpression;
当左侧表达式为 null 或 undefined 时,返回右侧表达式; 当左侧表达式为其他值(包括假值)时,返回左侧表达式。
// 实际示例 const username = null ??
'匿名用户'; // '匿名用户' const score = 0 ?? 100; 0
(保留有效值) const isActive = false ?? true; // false
(保留有效值) const emptyValue = undefined ?? '默认值'; // '默认值'
// 对比示例 const count = 0; console.log(count || 10); //10
(0 被视为假值) console.log(count ?? 10); //0
(保留有效值) const name = ""; console.log(name || "未知"); //"未知"console.log(name ?? "未知"); //""
核心应用场景
// 传统方式 const city = user && user.address && user.address.city || "未知"; 使用 ?? 和 ?.(可选链) const city = user?.address?.city ?? "未知";
function printMessage(message) { const text = message ?? "默认消息";
console.log(text); } printMessage(); //"默认消息" printMessage(null); //"默认消息" printMessage(""); //
""(保留空字符串) printMessage(0); //0(保留0)
const config = { timeout:0, // 显式设置为0retries: null, //
未设置值 title:"" // 空标题 }; const timeout = config.timeout ?? 3000; / 0 const retries = config.retries ?? 3; / 3 const title = config.title ?? "默认标题"; / ""
优先级与结合性规则
// 错误用法(语法错误) const value = a ?? b || c; // 正确用法(使用括号) const value = (a ?? b) || c; const anotherValue = a ?? (b || c);
小括号 ()(最高优先级) 逻辑非 ! 乘除运算符 *, / 加减运算符 +, - 比较运算符 >, <, >=, <= 相等运算符 ==, !=, ===, !== 逻辑与 && 逻辑或 || 空值合并 ?? 赋值运算符 =(最低优先级)
浏览器兼容性与环境支持
// 转译方案 constvalue = a !== null && a !== undefined ? a : b;
最佳实践总结
需要区分 null/undefined 和 0/""/false 的情况; 处理可能缺失的 API 响应数据; 配置对象中保留显式设置的假值; 与可选链 ?. 配合安全访问嵌套属性。
需要过滤所有假值(falsy values)的情况(应使用 ||); 在未使用括号的情况下与 || 或 && 混合使用; 需要支持 Internet Explorer 的项目。

本文作者:赵 卓(上海新炬中北团队)
本文来源:“IT那活儿”公众号

文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




