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

JavaScript动态二维数组构建:两种实现方式差异解析

二维数组构建差异的原因解析

两种构建方式的本质区别

1. 有效方案:new Array(height).fill().map()的工作逻辑

  • new Array(height)先创建一个长度为height的空数组,每个元素初始为empty状态
  • .fill()无参数调用时,会把所有empty位置填充为undefined
  • 后续的.map(() => new Array(width).fill(初始值))会遍历数组的每个元素,为每一行单独创建一个新的数组实例。每一行都是内存中独立的数组对象,修改某一行的元素不会影响其他行。

示例代码:

const width = 3;
const height = 3;
const grid = new Array(height).fill().map(() => new Array(width).fill(0));

grid[0][0] = 1;
console.log(grid);
// 输出:[[1,0,0], [0,0,0], [0,0,0]]

2. 失效方案:new Array(height).fill(row)的问题根源

  • 数组在JavaScript里属于引用类型,当你用fill(row)时,row是一个已创建的数组实例,fill会把新数组的所有元素都设置为同一个row数组的引用——也就是说,网格里的所有行其实指向内存中的同一个数组对象。
  • 不管你修改哪一行的元素,本质上都是在修改那个唯一的数组实例,所以最终所有行的内容会完全同步。

示例代码:

const width = 3;
const height = 3;
const row = new Array(width).fill(0);
const grid = new Array(height).fill(row);

grid[0][0] = 1;
console.log(grid);
// 输出:[[1,0,0], [1,0,0], [1,0,0]]

核心总结

fill方法处理引用类型时,只会复制引用而非创建新实例;而map方法通过回调函数为每个元素生成新的数组,确保了每一行的独立性。这就是两种构建方式结果差异的根本原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:48:21