JavaScript中使用*=运算结果为何是16而非11?
核心原因:运算符优先级和复合赋值运算符的规则
你遇到的结果差异本质是对JS运算符优先级和*=复合赋值运算符的运算规则理解有偏差,具体逻辑如下:
- 运算符优先级规则
JavaScript中,加法运算符+的优先级远高于复合赋值类运算符(包括*=、+=、-=等)。所以在执行n *= 3 + 5时,会优先计算优先级更高的加法部分,先得到3 + 5 = 8,再执行*=的运算逻辑。 - 复合赋值运算符的展开规则
*=这类复合赋值运算符,默认会将右侧的整个计算结果作为运算的右值,也就是说:变量 *= 右侧表达式完全等价于变量 = 变量 * (右侧所有表达式的运算结果),而不是直接把*=拆成*和=按从左到右的顺序运算。 - 实际运算过程拆解
let n = 2; n *= 3 + 5; // 实际执行顺序: // 第一步:计算右侧高优先级的加法 3 +5 = 8 // 第二步:展开复合赋值运算 n = n * 8 = 2 *8 =16 console.log(n); // 输出16
你之前理解的n = n *3 +5,是假设*=的优先级高于+才会得到的结果,不符合JS的运算符优先级规则,所以才会出现预期和实际结果不符的情况。
如果你想要得到11的结果,可以主动通过括号调整优先级,写成n = n *3 +5,或者分开执行两次赋值:n *=3; n +=5即可。
内容的提问来源于stack exchange,提问作者CypherZ
相关产品推荐
相关产品推荐

