Javascript 为什么函数重新指定2Darray参数作为调用后者的副作用

Javascript 为什么函数重新指定2Darray参数作为调用后者的副作用,javascript,Javascript,当我单独运行第三行并记录test2darr时,它返回一个3x3矩阵中填充了6的2D数组 但当我运行第四行并再次记录test2darr时,它返回: [4,5,4] ​ [5, 6, 5]​ [4,5,4] (以及第二次测试) 尽管它应该为test2darr返回相同的6数组,并在上将2d数组分配给secondtest const n = 3; const filler = new Array(n * n); const test2darr = fill2DarrFromArr(filler.fil

当我单独运行第三行并记录test2darr时,它返回一个3x3矩阵中填充了6的2D数组
但当我运行第四行并再次记录test2darr时,它返回:
[4,5,4]
​ [5, 6, 5]​
[4,5,4]
(以及第二次测试)
尽管它应该为test2darr返回相同的6数组,并在上将2d数组分配给secondtest

const n = 3;
const filler = new Array(n * n);

const test2darr = fill2DarrFromArr(filler.fill(6));

const secondtest = pileReduce(test2darr);
以下是我的fill2DarrFromArr和PILEREDUCT代码:

function pileReduce(_cells) { 

    _cells = fillEmpty(_cells);

    for (let j = 0; j < _cells.length; j++) { //The Algorithm itself is not important 
        for (let i = 0; i < _cells.length; i++) { // But there might be some assignment problem that I missed
            if (_cells[j][i] >= 4) {
                _cells[j][i] = _cells[j][i] - 4;

                if (j !== _cells.length - 1) _cells[j + 1][i]++;
                if (j !== 0) _cells[j - 1][i]++;
                if (i !== _cells.length - 1) _cells[j][i + 1]++;
                if (i !== 0) _cells[j][i - 1]++;
            }
        }
    }
    return _cells;
}

function fill2DarrFromArr(_arr) { 
     let sideLength = Math.sqrt(_arr.length);
     let out = create2DArr(sideLength, sideLength);
    for (let j = 0; j < sideLength; j++) {
        for (let i = 0; i < sideLength; i++) {
            out[j][i] = _arr[j * sideLength + i];
        }
    }
    return out;
}

function create2DArr(_n, _m) {
    let _arr = new Array(_n);

    for (let j = 0; j < _m; j++) {
        _arr[j] = new Array(_m);
    }
    return _arr;
}

function fillEmpty(_arr) {
    for (let j = 0; j < _arr.length; j++) {
        for (let i = 0; i < _arr.length; i++) {
            if (!_arr[j][i]) _arr[j][i] = 0;
        }
    }
    return _arr;
}
函数pillereduce(_cells){
_单元格=填充空(_单元格);
对于(设j=0;j<_cells.length;j++){//算法本身并不重要
对于(设i=0;i<_cells.length;i++){//但可能有一些我遗漏的赋值问题
如果(_单元格[j][i]>=4){
_单元[j][i]=_单元[j][i]-4;
如果(j!==_cells.length-1)_cells[j+1][i]+;
如果(j!==0)u单元[j-1][i]+;
如果(i!==_cells.length-1)_cells[j][i+1]++;
如果(i!==0)u单元[j][i-1]+;
}
}
}
返回单元;
}
函数fill2DarrFromArr(_arr){
设边长=数学sqrt(_arr.length);
放线=create2DArr(边长,边长);
对于(设j=0;j
将数组传递给函数不会创建该数组的副本。您的函数正在修改传递的数组的内容,因此它们有副作用。

fillempty的定义丢失。我将fillempty添加到定义中。如果没有那条线,情况不会有多大变化。