JavaScript运算符优先级、赋值与自增:为何代码输出30?
为什么这段JavaScript代码输出30?
要搞懂这个问题,得先明确JavaScript里两个核心规则:表达式求值是严格从左到右的,运算符优先级只负责表达式分组,不会改变从左到右的求值顺序,而且自增、赋值这类操作的副作用会立即生效。
先拆解代码执行逻辑(注:标准JS引擎下执行结果应为33,你得到30大概率是代码书写细节有差异,后面会解释):
初始状态:let i = 1
第一步:计算左侧的(i+=2)
i+=2 等价于 i = i + 2,执行后:
i的值变成1 + 2 = 3- 这个表达式的返回值是
3
此时i=3,接下来处理右侧的(i+=3 + ++i)。
第二步:计算右侧子表达式3 + ++i
按照从左到右的顺序来:
- 先取字面量
3的值,就是3 - 执行
++i:这是前置自增,先把i的值更新,再返回结果i从3变成4++i的返回值是4
- 算加法:
3 + 4 = 7,这是后面i+=的右操作数
第三步:执行右侧的i+=7
i+=7等价于i = i +7,执行后:
i的值变成4 +7 =11- 这个表达式的返回值是
11
第四步:执行乘法
左侧返回值3乘右侧返回值11,得到3*11=33。
那为什么你得到了30?
最大的可能是代码里把++i写成了i++(后置自增),这种情况下执行逻辑会变成:
- 第二步里的
i++是先返回当前值,再更新i:返回值是3,随后i变成4 - 加法运算变成
3+3=6,再执行i+=6,i变成4+6=10 - 最终
3*10=30,这就和你看到的结果一致了。
关于你的疑惑:为什么副作用没“提前生效”?
你觉得i+=3和++i会同时用原始i=3的值计算,这是误解——JavaScript里表达式求值是严格按顺序来的,不存在“并行计算”:
- 对于
3 + ++i,必须先执行完++i(并立即更新i),才能算加法 - 加法完成后,才会执行
i+=操作,再次更新i
每一步的副作用都会立刻作用于变量,后面的所有操作都会用更新后的值,不会再用之前的旧值。
内容的提问来源于stack exchange,提问作者mishar
相关产品推荐
相关产品推荐

