通过引用传递数组不是't工作

Passing an array by reference isn't working

本文关键字:工作 引用 数组      更新时间:2023-09-26

我试图通过引用传递一个变量,但它没有正常工作(或者我希望它能正常工作)。

调用了callMeMaybe之后,boardCopy仍然是空的,我不知道为什么。如果我在第一个函数中用boardCopy = board.slice(0)复制电路板,而在第二个函数中不这样做,它就可以工作了,但这不是一个选项,因为真正的电路板会大得多,而callMeAnytime将是一个递归函数,而且要复杂得多。

callMeAnytime(3, [], [1, 0, 1, 1]);
function callMeAnytime(index, moves, board) {
    for (var i = index; i >= 0; i--) {
        var boardCopy = [];
        callMeMaybe(i, board, boardCopy)
        console.log(board); // [1, 1, 1, 1]
        console.log(boardCopy); // []
    }
}
function callMeMaybe(i, board, boardCopy) {
    if (board[i] == 1) {
        boardCopy = board.slice(0);
        boardCopy[i] = 0;
        console.log(board); // [1, 1, 1, 1]
        console.log(boardCopy); // [1, 1, 1, 0]
    }
}

如前所述,javascript使用传递值,您可以修改对象元素/属性,但不能替换对象本身。slice向对象返回一个新数组。你将不得不这样做。

slice不会更改原始数组,而是返回一个新的"一级"深层"副本,其中包含从原始数组。

function callMeMaybe(i, board, boardCopy) {
    if (board[i] == 1) {
        //boardCopy = board.slice(0);
        var length = board.length,
            j = 0;
        boardCopy.length = 0;
        while (j < length) {
            if (Object.prototype.hasOwnProperty.call(board, j)) {
                boardCopy[j] = board[j];
            }
            j += 1;
        }
        boardCopy[i] = 0;
        console.log(board);
        console.log(boardCopy);
    }
}

您正在为局部变量分配一个新值。当你在callMeAnytime中进行拼接时,它就起作用了,因为它被分配给了"主/原始变量"(它被传递给callMeMaybe,所以callMeMaybe不会重新分配局部变量)

编辑:正如millimouse所说,你一开始就不能在Javascript中通过引用传递。如果你给我们更多关于你想做什么的细节,我们可能会为你指明正确的方向。