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
相关产品推荐
相关产品推荐

