javascript - 修改多维数组的一个索引会导致其他所有子数组发生变异?

标签 javascript arrays pass-by-reference

所以,我已经像这样初始化了一个多维数组。

let arr = new Array(5).fill(new Array(5).fill(0));
正在做
arr[2][3] = 1;
会给我们
0 0 0 0 0
0 0 0 0 0
1 1 1 1 1
0 0 0 0 0
0 0 0 0 0
为什么是这样?我猜这是一个通过引用传递的问题,这只是一个在每个后续索引中都有引用的数组,但是我正在创建一个新的,那么为什么会发生这种情况呢?

let arr = new Array(5).fill(new Array(5).fill(0));
arr[2][3] = 1;
console.log(JSON.stringify(arr));

最佳答案

new Array(5).fill(0)只需创建一个用零填充的数组。然后,您使用对同一数组的 5 个引用填充外部数组。
如果您编写等效代码,您可以更轻松地看到正在发生的事情:

let row = new Array(5).fill(0);
arr = new Array(5).fill(row);
只有一个row数组,然后你填写 arr与它的引用。
您需要使用循环,以便为每一行创建一个新数组。
arr = [];
for (let i = 0; i < 5; i++) {
    arr.push(new Array(5).fill(0))
}

关于javascript - 修改多维数组的一个索引会导致其他所有子数组发生变异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64381748/

相关文章:

java - Hibernate 在调用 save 后丢失了引用。你知道为什么吗?

java - Java 是 "pass-by-reference"还是 "pass-by-value"?

java - Java 中如何在 ArrayList 和 TreeSet 之间共享元素?

javascript - iframe 子级与多个 iframe 的父级通信

javascript - JavaScript 中的测验 : Convert into binary numbers, 覆盖数组

c++ - C int 到 char 转换添加了垃圾字符

c - 有没有办法 malloc 一个数组大小为 10 的整数指针并返回它的值?

php - 使用弹出窗口打开我的网站

javascript - 在ie中用js编辑css报错

javascript - 如何使用主干将 'this' 传递给事件?