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

JavaScript使用||短路运算实现对象计数时自增及括号赋值逻辑疑问

代码疑问解答

你贴的代码用于统计game.scored数组中球员姓名的出现次数,核心行用逻辑或的短路特性实现了统计逻辑,两个疑问的解答如下:

疑问1:duplication[x]++中++符号的作用

这里的++是后置自增运算符,执行逻辑分为两步:

  • 第一步:先返回变量当前的原始值,参与当前表达式的运算
  • 第二步:再将变量的数值加1
    对应到当前场景:
    如果球员x已经在duplication中存在(对应值≥1,为真值),duplication[x]++会先返回当前计数(真值),触发||的短路逻辑,不会执行右侧的赋值,同时自动将该球员的计数加1。
    如果是首次出现的球员,duplication[x]初始值为undefined,duplication[x]++先返回undefined(假值),会继续执行||右侧的逻辑。

疑问2:为什么需要将(duplication[x]=1)放在括号内

这是运算符优先级的要求:

  • 逻辑或||的优先级高于赋值运算符=,如果不加括号,JS引擎会把代码解析为(duplication[x]++ || duplication[x]) = 1,相当于要把1赋值给||运算返回的临时结果,这属于语法错误——赋值运算符的左操作数必须是可写入的变量或对象属性,不能是临时表达式结果。
  • 加括号后会提升括号内赋值运算的执行优先级,保证括号整体作为||的右操作数,当左侧为假时,执行括号内的赋值,给首次出现的球员设置初始计数1。

等价易读写法

你可以把精简的逻辑换为更易懂的等价写法,运行结果完全一致:

const game = {
  score: "4:0",
  scored: ["Lewandowski", "Gnarby", "Lewandowski", "Hummels"],
};

const duplication = {};
for (let x of game.scored) {
  if (duplication[x]) {
    duplication[x]++;
  } else {
    duplication[x] = 1;
  }
}

console.log(duplication); // 输出: { Lewandowski: 2, Gnarby: 1, Hummels: 1 }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:45:05