You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript初始化二维数组规避浅拷贝的最佳方案

问题根因

你当前的初始化写法出现联动修改的核心原因是:Array.fill() 传入引用类型值(数组、对象等)时,填充到数组每个位置的都是同一个内存引用。也就是说你创建的visited数组里所有行都指向同一个子数组实例,修改任意一行的元素,本质都是修改那个共享数组,自然所有行的对应位置都会同步变化。

最佳初始化方案

用Array.from配合映射函数生成二维数组,保证每一行都是独立创建的新数组实例,不存在引用共享问题:

let grid = 
  [
    ["0", "1", "0"],
    ["1", "0", "1"],
    ["0", "1", "0"],
  ]

// 正确初始化visited数组
let visited = Array.from({ length: grid.length }, () => new Array(grid[0].length).fill(false))

visited[0][1] = true
console.log(visited)

执行后输出符合预期:

[
  [ false, true, false ],
  [ false, false, false ],
  [ false, false, false ]
]

如果习惯用数组实例方法,也可以用下面的等价写法,效果完全一致:

let visited = new Array(grid.length).fill().map(() => new Array(grid[0].length).fill(false))

注意这个写法里fill()不传参数,是为了先把数组填充为undefined占位,后续map遍历才能正常生成每一行的独立子数组。

内容的提问来源于stack exchange,提问作者stumped

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:00:54