最推荐 Array.from() 嵌套写法:const matrix = Array.from({ length: rows }, () => Array.from({ length: cols }, () => 0)),每行均为独立数组实例,避免引用共享;fill().map() 也安全,但不可省略 fill();禁用 fill(Array()) 等共享引用方式。

推荐方式:确保每行都是独立数组
JavaScript 没有原生二维数组,只有“数组的数组”,所以关键在于让每一行都指向不同的数组实例。最推荐的是 Array.from() 嵌套写法:
const matrix = Array.from({ length: rows }, () => Array.from({ length: cols }, () => 0));- 每次回调都新建一个子数组,天然隔离,语义清晰,无引用共享风险
- 想初始化为
null、''或空数组,只需改最后一层回调:如() => []或() => ''
另一个常用且安全的方案是 fill().map():
const matrix = Array(rows).fill().map(() => Array(cols).fill(0));-
fill()先填占位值(如undefined),再用map逐项生成新数组,避免了fill直接填充引用的问题 - 注意不能省略
fill()——Array(3).map(...)不会执行,因为索引未被赋值
常见误区:所有行指向同一个数组
最典型错误是用 Array(n).fill(Array(m).fill(x)) 或 new Array(n).fill([]):
- 数组是引用类型,
fill()把同一个数组对象的引用复制到每个位置 - 修改
matrix[0][0]会导致matrix[1][0]、matrix[2][0]全部变化 - 哪怕用
new Array(3).fill(new Array(4).fill(0))也一样危险——外层数组仍共享内层数组
另一个易忽略问题是未初始化中间层级就直接赋值:
立即学习“Java免费学习笔记(深入)”;
-
arr[i][j] = 1会报错Cannot set property 'j' of undefined,因为arr[i]还没创建 - 安全写法是先检查或提前初始化:
if (!arr[i]) arr[i] = [];,或用可选链arr?.[i]?.[j]
实用补充:按场景选方法
不需要追求“最短”,而要兼顾可读性、兼容性和调试需求:
-
教学或逻辑敏感场景:用传统
for循环,步骤明确,不易出错 -
需要动态结构(如每格初始化为空数组):
Array.from({ length: r }, () => Array.from({ length: c }, () => [])) -
旧环境兼容(如需支持 IE):避免
Array.from和可选链,回归for循环 +push
核心原则始终不变:只要保证每一行是新 Array() 实例,就不会跨行污染。


















