You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

按照从左到右的顺序来:

  1. 先取字面量3的值,就是3
  2. 执行++i:这是前置自增,先把i的值更新,再返回结果
    • i 从3变成4
    • ++i的返回值是4
  3. 算加法: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:45:01