据我了解,额外的赋值运算符只是缩短了我们递增值的方式,例如,我们不使用
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 || 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;
}
}