You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

逻辑或、空值合并运算符结合includes与三元表达式的行为是否符合预期?

逻辑运算符与三元表达式结合的优先级问题

现象描述

当把逻辑或(||)、空值合并运算符(??)和三元表达式、includes方法混用的时候,会出现和预期不符的结果:

const result = 'Hello' || ['e', 'z'].includes('e') ? 'in-array' : 'not-in-array';
console.log(result) // 'in-array'

const result = 'Hello' ?? ['e', 'z'].includes('z') ? 'in-array' : 'not-in-array';
console.log(result) // 'in-array'

const result = 'Hello' || ['e', 'z'].includes('xx') ? 'in-array' : 'not-in-array';
console.log(result) // 'in-array'

const result = 'Hello' ?? ['e', 'z'].includes('xx') ? 'in-array' : 'not-in-array';
console.log(result) // 'in-array'

只有给右侧的三元表达式加上括号,代码才会按预期返回'Hello':

const result = 'Hello' || (['e', 'z'].includes('e') ? 'in-array' : 'not-in-array');
console.log(result) // 'Hello'

const result = 'Hello' ?? (['e', 'z'].includes('z') ? 'in-array' : 'not-in-array');
console.log(result) // 'Hello'

解答:这是完全符合规范的预期行为

问题出在JavaScript的运算符优先级上:

  • 三元运算符(?:)的优先级比||和??都低
  • 所以你的代码会先执行左侧的逻辑运算,比如'Hello' || ['e', 'z'].includes('e'),结果是真值'Hello',接着这个真值会作为三元表达式的判断条件,直接返回'in-array'——不管后面的includes结果是什么。

拿第一个例子拆解来看,实际执行顺序是这样的:

// 第一步:先算逻辑或
const temp = 'Hello' || ['e', 'z'].includes('e'); // 结果是'Hello'
// 第二步:用temp作为三元条件
const result = temp ? 'in-array' : 'not-in-array'; // 输出'in-array'

而加括号后,括号的优先级最高,会先执行括号里的三元表达式,再和左侧的逻辑运算符运算。此时'Hello'是真值,||和??都会直接返回它,不会再执行后面的三元表达式,这就符合你的预期了。

内容的提问来源于stack exchange,提问作者Marvine Bamba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 20:34:50