JavaScript嵌套for循环赋值异常:oArr=mArr位置是否有误?
嵌套循环数组计算错误的原因与修复
问题核心
不是oArr = mArr的位置错误,而是mArr未在每次外层循环时重新初始化,且数组引用复用导致计算被污染。
具体原因
- 原代码中
mArr在所有循环外部声明,第一次外层循环(j=0)执行后,mArr被填充9个值,随后oArr = mArr让两个变量指向同一个数组内存地址。 - 第二次外层循环(j=1)开始时,未重置
mArr为空数组,直接在原数组上修改元素。计算i=1时,i=0的位置已被新值覆盖(变成oArr[0]+oArr[1] = 2),但你期望用的是上一轮的原始oArr值(全1)。此时oArr和mArr是同一个数组,oArr[0]已是更新后的2,所以计算结果变成2 + 1 + 1 = 4,也就是你看到的oArr[1]*2 + oArr[2] + oArr[0](原oArr[0]是1,现在变成2,相当于多了一个原oArr[1]的值)。
修复方案
将mArr的声明移到外层循环内部,每次外层循环开始时创建新的空数组,确保每次计算都基于上一轮的独立oArr值,不会被当前循环的修改干扰:
let oArr = [1,1,1,1,1,1,1,1,1] let n = 9 let k = 5 for (let j = 0; j < k; j++) { let mArr = [] // 每次外层循环重新初始化mArr for (let i = 0; i < n; i++) { if (i === 0) { mArr[i] = oArr[0] + oArr[1] } else if (i === (n - 1)) { mArr[i] = oArr[i] + oArr[i - 1] } else { mArr[i] = oArr[i] + oArr[i + 1] + oArr[i - 1] } } console.log(`j == ${j},mArr == ${mArr}`) oArr = mArr }
额外说明
如果需要保留原oArr不被修改(比如后续还要复用),可以在计算mArr时基于oArr的副本,但在当前场景下,每次外层循环后oArr需要更新为新的mArr,所以直接重新初始化mArr就足够解决问题。
内容的提问来源于stack exchange,提问作者ptter
相关产品推荐
相关产品推荐

