JavaScript能否用变量作为for循环的三段语句?为何示例代码无输出也不报错?
问题原因
核心问题是for循环三个位置的表达式是每次循环动态执行的,但你提前赋值成普通变量后,值会固定在赋值的那一刻,不会随着循环重复计算,具体拆解如下:
- 赋值时就已经固定了所有变量的值,且提前修改了i的初始值
const first = i = 0, second = i < 5, third = i++这行代码会同步完成所有计算:- 先执行
i = 0,first变量的值固定为0 - 此时i为0,
i < 5的结果为true,second变量的值直接固定为true,后续循环不会再重新判断i的大小 - 执行
i++,i的值直接变成1,third变量的值固定为i++的返回值0,后续循环不会再自动执行i++操作
- 先执行
- for循环执行时变成死循环
for (first; second; third)实际运行逻辑是:- 初始化位置的first只是读取已有的固定值0,不会重新修改i的值
- 循环条件永远取固定的true,永远不会退出循环
- 每次循环结束只会读取third的固定值0,不会给i做自增,i永远停留在1
最终代码会无限打印arr[1]也就是1,既不会走到结束,也没有语法错误,所以无法得到预期的依次打印0到4的结果。
正确写法参考
如果要把三个逻辑抽离出来,需要定义成函数保证每次循环都重新计算:
const arr = [...Array(5).keys()]; let i = 0; // 条件判断和迭代都定义成函数,每次循环主动调用才会重新计算 const condition = () => i < 5; const increment = () => i++; for (; condition(); increment()) { console.log(arr[i]) }
内容的提问来源于stack exchange,提问作者user13084463
相关产品推荐
相关产品推荐

