JavaScript中带条件与无明确条件for循环的差异原因解析
JavaScript带约束与无约束for循环的差异解析
1. 标准带条件for循环的执行流程
先看你给出的带条件循环:
for(var i = 3; i >= 0; i--) { console.log(i); }
for循环的执行逻辑是初始化 → 条件判断 → 循环体 → 后置操作,循环往复直到条件不成立:
- 第一步:初始化
i = 3 - 第一次判断:
3 >= 0为真,执行循环体输出3,然后执行i--,i变为2 - 后续每次都是先判断
i >= 0,成立就输出当前i,再递减,直到i变为-1时,-1 >= 0为假,循环终止。所以输出顺序是3、2、1、0。
2. 无约束i--循环跳过首次迭代的原因
再看这个无约束循环:
for(var i = 3; i--;) { console.log(i); }
这里的条件判断部分直接是i--,要注意后置递减运算符i--的特性:先返回当前变量的值,再对变量执行减1操作。循环的执行逻辑变成:
- 初始化
i = 3 - 第一次条件判断:取
i当前值3作为判断依据(3是真值,条件成立),但判断完成后i立刻变成2,随后进入循环体输出的是已经减1后的i,也就是2 - 第二次判断:
i是2,返回2作为真值,条件成立,i变成1,输出1 - 第三次判断:
i是1,返回1作为真值,条件成立,i变成0,输出0 - 第四次判断:
i是0,返回0作为假值,条件不成立,循环直接终止,不会进入循环体。
这就是为什么这个循环跳过了3,只输出2、1、0的原因——首次判断后i已经被递减,循环体拿到的是递减后的值,而最后一次判断时i为0,直接终止循环,不会执行循环体输出0。
3. 递增操作导致无限循环的本质
如果把循环改成递增:
for(var i = 3; i++;) { console.log(i); }
同样看后置递增运算符i++的特性:先返回当前值,再执行加1操作。这里的问题在于:
- 第一次判断:
i是3,返回3(真值),条件成立,i变成4,输出4 - 后续每次判断,
i的当前值都是正数(会一直递增到Number.MAX_VALUE,甚至变成Infinity),而所有非零的数字都是真值,永远不会触发“条件为假”的终止逻辑。 - 不管
i增到多大,i++返回的都是递增前的正数,始终为真,循环会一直执行下去,直到内存溢出或者手动终止,这就是无限循环的原因。
内容的提问来源于stack exchange,提问作者Mads Kock
相关产品推荐
相关产品推荐

