为何修改matrix子数组元素后两个子数组同步变化?预期结果不符求助
问题原因与解决方案:数组元素修改时意外同步变化
你遇到的问题本质是JavaScript引用类型的特性导致的:
在JS里,数组属于引用类型,变量point存储的不是[0,0]这个数组本身,而是它在内存中的地址。当你循环执行matrix.push(point)时,其实是把同一个内存地址重复添加到了matrix里——也就是说,matrix[0]和matrix[1]指向的是同一个数组对象。所以不管你通过哪个索引修改数组内容,另一个都会跟着改变,因为它们根本就是同一个东西。
解决办法
每次循环都要创建一个新的数组,而不是重复添加同一个引用,常见实现方式有两种:
- 直接在push时创建新数组
let matrix = [] for (let x = 0; x < 2; x++){ matrix.push([0, 0]) // 每次循环生成全新的数组 } matrix[0][0] = 1 console.log(matrix) // 输出 [[1,0],[0,0]]
- 复制原数组的内容到新数组(适合原数组内容动态变化的场景)
let matrix = [] let point = [0, 0] for (let x = 0; x < 2; x++){ matrix.push([...point]) // 用扩展运算符复制point的内容到新数组 // 也可以用 point.slice() 或者 Array.from(point) 实现复制 } matrix[0][0] = 1 console.log(matrix) // 输出 [[1,0],[0,0]]
内容的提问来源于stack exchange,提问作者kiborgok
相关产品推荐
相关产品推荐

