为什么JavaScript中无括号时??不能与&&、||运算符混用?
JavaScript 禁止空值合并运算符(??)直接与 &&/|| 混用的设计原因
核心是从减少歧义、降低隐性bug概率、保障历史兼容三个角度出发做的语法强制约束:
- 首先是消除优先级认知歧义
&& 和 || 是 JS 早期就存在的运算符,开发者已经形成了固定的优先级认知,但 ?? 作为 ES2020 才加入的新运算符,无论官方将它的优先级设定为高于还是低于 &&/||,都会有大量开发者记错、搞混。比如代码false ?? "fallback" || "backup",如果没有明确括号的话,两种计算顺序会得到完全不同的结果:若先算
??:结果为(false ?? "fallback") || "backup" = false || "backup" = "backup"
若先算||:结果为false ?? ("fallback" || "backup") = false ?? "fallback" = false
没有语法限制的话,不同开发者对同一段代码的执行结果预期会完全不一致,很容易写出隐性bug。 - 其次是强制开发者明确自身意图
这种语法限制本质是倒逼开发者主动用括号标注运算顺序,不需要其他维护者再去查优先级表就能明确代码逻辑,大幅提升代码可读性和可维护性,也避免了开发者自己因为记错优先级写出不符合预期的代码。 - 最后是保障历史逻辑的兼容性
?? 推出前所有的 JS 代码里的 &&/|| 运算都有固定的执行逻辑,如果直接给 ?? 设定默认优先级,可能会导致旧代码改造、新老语法混用时出现预期外的执行结果,语法层面直接禁止混用不加括号的写法,就完全规避了这类兼容风险。
内容的提问来源于stack exchange,提问作者Sourabh Saxena
相关产品推荐
相关产品推荐

