fill() 无法生成唯一引用的多维空矩阵,因其复用同一对象;正确做法是用 array.from() 或 fill().map() 每次返回新实例,确保每层子数组独立。

直接用 fill() 填充数组再 map(),无法生成具备唯一引用的多维空矩阵——因为 fill() 复用同一引用,所有子数组实际指向同一个对象。
问题根源:fill() 不创建新实例
Array(3).fill([]) 会生成一个长度为 3 的数组,但它的三个元素都引用同一个空数组。后续任一子数组的修改(如 arr[0].push(1))会影响所有行。
正确做法:用 map() 替代 fill() 创建独立子数组
跳过 fill(),直接用 Array(n).fill().map(() => []) 或更推荐的 Array.from({ length: n }, () => [])。两者都确保每次回调返回一个全新数组实例。
-
Array(3).fill().map(() => []):先创建稀疏数组再填充undefined,再对每个位置调用() => [],生成三个独立空数组 -
Array.from({ length: 3 }, () => []):语义更清晰,明确按长度生成新数组,每项由工厂函数生成
生成二维空矩阵(如 3×4)
需嵌套构造:外层数组每项是一个内层数组,且每个内层数组也要独立。
- ✅ 正确:
Array.from({ length: 3 }, () => Array.from({ length: 4 }, () => [])) - ✅ 等价写法:
Array(3).fill().map(() => Array(4).fill().map(() => [])) - ❌ 错误:
Array(3).fill(Array(4).fill([]))—— 所有行共享同一列数组
生成带默认值的矩阵(如全 0)
若需数值型矩阵(如 [[0,0,0],[0,0,0]]),仍要避免引用复用。基本类型(数字、字符串)无引用问题,但为保持习惯一致性,推荐统一用 map 构造:
Array.from({ length: 2 }, () => Array.from({ length: 3 }, () => 0))- 或简写:
Array(2).fill().map(() => Array(3).fill(0))(此处fill(0)安全,因 0 是基本类型)
关键在“每一层都用函数生成新实例”,而不是靠 fill() 复制引用。不复杂但容易忽略。










