为什么`foo += a || b` 不等于 `foo = foo + a || b`?

问题描述 投票:0回答:1

据我了解,额外的赋值运算符只是缩短了我们递增值的方式,例如,我们不使用

x = x + 1
,而是使用
x += 1
,现在,这是此方法没有的情况的示例不按预期为我工作。我想循环遍历给定的字符串,将当前字符添加到预先声明的空对象中,如果该字符已存在于对象中,我会将其值增加1,如果不存在,则将其添加为1.换句话说,我正在构建给定字符串的字符映射表。

let charMap = {}

for (let char of 'doooppy') {
  charMap[char] = charMap[char] + 1 || 1;
}

这就像一个魅力。现在检查以下内容

let charMap = {} 

for (let char of 'doooppy') {
  charMap[char] += 1 || 1;
}

现在返回一个 NaN,这对我来说很奇怪,因为它与使用赋值运算符的想法相同。有人可以解释这是为什么吗?谢谢。

javascript operator-precedence assignment-operator augmented-assignment
1个回答
2
投票
在评估

1 || 1

 之前先评估 
charMap[char] += 1 || 1;
。这就是 JavaScript 中运算符优先级的工作方式。带||的部分在带有 += 的部分之前进行评估。第一次运行该行代码时,charMap[char] 未定义。对未定义使用 += 会返回 NaN,然后在后续执行中对 NaN 使用 += 也会返回 NaN。

+= 的正确解决方案是:

let charMap = {} 

for (let char of 'doooppy') {
  if (!charMap[char]) {
    charMap[char] = 1;
  } else {
    charMap[char] += 1;
  }
}

© www.soinside.com 2019 - 2024. All rights reserved.