JS for循环结束后变量j值无故从2变为3的原因排查
问题原因
该现象是JavaScript for循环的标准执行逻辑导致的,不属于代码异常:
- 内层for循环的终止判断条件为
j <= 2,循环执行流程固定为:- 初始化变量j为0
- 判断j是否满足
j <= 2的执行条件,满足则进入循环体执行内部逻辑 - 循环体执行完成后,执行自增操作
j++ - 回到第二步做条件判断,决定是否进入下一轮循环
- 当j值为2时,会先通过条件判断进入循环体,执行完
S += board[j][i]的逻辑后,执行j++将j值更新为3,此时再做条件判断3 <= 2结果为false,才会正式退出内层循环。因此循环结束后j的值必然为3,不存在“莫名变化”的问题。 - 代码还存在两个易引发bug的问题:
- 内层循环的j变量未使用
let/const声明,会默认成为全局变量,外层多轮i循环执行时j的值会互相污染 - 调用
prevent()时直接传入循环结束后的j=3属于逻辑错误,井字棋行列有效索引只有0、1、2三个值,遍历列时需要单独记录该列空位对应的行索引,不能直接复用循环终止后的j值。
- 内层循环的j变量未使用
修正参考代码
for(let i = 0; i <= 2; i++) { let S = 0; let emptyRowIndex = -1; // 给j添加let声明,避免全局变量污染 for(let j = 0; j <= 2; j++) { console.log("j = ", j) S += board[j][i]; // 记录当前列空位所在的行索引 if(board[j][i] === 0) emptyRowIndex = j; } if(S === 2) { console.log("检测到待封堵列,空位行索引:", emptyRowIndex) // 传入正确的空位索引 if(prevent(i, emptyRowIndex, "column")) return 1; else return 0; } S = 0; }
内容的提问来源于stack exchange,提问作者Tamas Nyari
相关产品推荐
相关产品推荐

