Javascript 为什么多次调用Array.fill会影响未引用的数组?
在使用Javascript实例化数组的不同方法时,我注意到了一些有趣的行为:Javascript 为什么多次调用Array.fill会影响未引用的数组?,javascript,arrays,Javascript,Arrays,在使用Javascript实例化数组的不同方法时,我注意到了一些有趣的行为: matrix = Array(3).fill(Array(3).fill(0)) 创建包含0个值的NxN矩阵 [ [0,0,0], [0,0,0], [0,0,0] ] 然后我尝试将矩阵的第一行全部更改为1: matrix[0].fill(1) 出于某种原因,将矩阵中的所有值都转换为1: [ [1,1,1], [1,1,1], [1,1,1] ] 这种行为对我来说毫无意义。对Array.
matrix = Array(3).fill(Array(3).fill(0))
创建包含0个值的NxN矩阵
[
[0,0,0],
[0,0,0],
[0,0,0]
]
然后我尝试将矩阵的第一行全部更改为1:
matrix[0].fill(1)
出于某种原因,将矩阵中的所有值都转换为1:
[
[1,1,1],
[1,1,1],
[1,1,1]
]
这种行为对我来说毫无意义。对Array.fill的最终调用不应该只影响第一行吗?这是怎么回事?您的代码相当于
let row = [0,0,0]
let matrix = [row, row, row];
row.fill(1);
因为.fill(Array(3).fill(0))
调用Array(3).fill(0)
一次以获取填充值-如果fill参数是回调,则它将为矩阵中的每个项调用它-但fill参数是一个值
在javascript中,数组被称为引用
var a = [1,2,3], b=a;
b[0] = 4
将导致a
和b
引用具有值的数组[4,2,3]
因此,由于每个行都是相同的数组,因此您的结果如您所见
试试这个
const matrix=Array.from({length:3},()=>Array(3.fill(0))
矩阵[0]。填充(1);
控制台日志(矩阵)代码>必须是内部数组都相同吗matrix[0]===matrix[1]
必须等于true。因为要用对同一数组的引用填充数组3次-请尝试matrix=array。从({length:3},()=>array(3)。填充(0))
改为调用array(3)。每次填充(0)
,为每一行创建一个新数组有一个>问题,我有一种感觉,它与此类似。谢谢你的详细解释!