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