for循环后置语句变量递增赋值问题:为何部分写法无法正常递增
为啥你的第一个for循环变量没法正常递增?
嘿,这个问题问得好!虽然你知道这不是多变量操作的最优解,但搞清楚背后的逻辑确实能帮你更理解JS的表达式和赋值规则~
先看你写的第一个循环的后置语句:
i1, i2 = i1+4, i2+4
这里的核心问题是你没有对i1做任何赋值操作,而且对i2的赋值也只是用了i1+4(没修改i1本身),最后那个i2+4更是只算了个值,没存回去。
我们拆解这个后置语句的执行顺序(JS里逗号运算符会从左到右依次执行每个表达式,每个表达式的副作用会生效,但只返回最后一个表达式的值):
- 第一个表达式
i1:只是读取i1的当前值(初始是0),没有任何修改; - 第二个表达式
i2 = i1+4:把i1+4(也就是0+4=4)赋值给i2,i2变成4,但i1还是0; - 第三个表达式
i2+4:计算4+4=8,但这个结果没有赋值给任何变量,i2依然是4。
所以每次循环,i1永远停在初始的0,i2每次被重置为4,自然永远没法超过4啦!
再看第二个循环的后置语句:
i1, i2 = i1+=4, i2+=4
这里关键用了复合赋值运算符+=——它和单纯的+完全不同:i1+=4等价于i1 = i1+4,不仅会计算新值,还会把结果赋值回给i1,直接修改了变量本身。
同样拆解执行顺序:
- 第一个表达式
i1:还是读取值,没修改; - 第二个表达式
i2 = i1+=4:先执行i1+=4,i1从0变成4,然后把这个更新后的i1值(4)赋值给i2,此时i2是4; - 第三个表达式
i2+=4:执行i2 = i2+4,i2从4变成8。
所以每次循环,i1都会加4,i2也会在被赋值为i1的新值后再加4,自然能正常递增啦!
不过顺便提一句,如果你想让i1和i2每次都各自加4,其实更清晰的写法是把后置语句写成:
i1 +=4, i2 +=4
这样就不用绕逗号赋值的弯子,可读性也更高~
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

