原始Javascript,其他赋值运算符误解

时间:2018-11-29 21:55:12

标签: javascript

据我了解,附加赋值运算符只是缩短了我们增加值的方式,例如,我们使用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,这对我来说很奇怪,因为它与使用赋值运算符的想法相同。有人可以解释为什么吗?谢谢。

1 个答案:

答案 0 :(得分: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;
  }
}