新建数组方式对比 数组的数组与引用的数组

66 阅读1分钟

问题代码

let arr = new Array(5).fill(new Array(6).fill(0))
for(let i = 1 ; i < 5 ; i ++){
    for(let j = 1 ; j < 6 ; j ++){
        arr[i][j] = j+1
    }
}
console.log(arr)

image.png

为什么第一行的值也发生了改变?

遇到的问题是由于JavaScript中数组的引用机制导致的。当使用new Array(5).fill(new Array(6).fill(0))创建数组时,实际上是创建了一个包含5个元素的数组,每个元素都是对同一个内部数组的引用

这意味着,当修改任何一个内部数组(比如arr[i][j] = j+1)时,实际上是在修改所有内部数组,因为它们都是指向同一个数组对象。

为了解决这个问题,需要创建一个数组的数组,而不是引用的数组。这可以通过使用map方法来实现。

解决代码

let arr = Array.from({ length: 5 }, () => Array(6).fill(0));
for(let i = 1 ; i < 5 ; i ++){
    for(let j = 1 ; j < 6 ; j ++){
        arr[i][j] = j+1
    }
}
console.log(arr)

image.png

更清晰的对比

image.png

-------------- vs -----------------

image.png