1

我试图通过引用传递一个变量,但它没有像它应该的那样工作(或者我希望它会这样)。

boardCopy被调用后仍然是空callMeMaybe的,我不知道为什么。如果我已经在第一个函数中复制了板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]
    }
}
4

2 回答 2

2

如前所述,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);
    }
}
于 2013-06-23T00:34:56.383 回答
1

您正在为局部变量分配一个新值。它在您进行拼接时起作用,callMeAnytime因为它被分配给“主/原始变量”(它被传递给callMeMaybe,因此callMeMaybe不会重新分配局部变量)

编辑:正如millimoose所说,您首先不能在Javascript中通过引用传递。如果您向我们提供有关您正在尝试做的事情的更多详细信息,我们可能会为您指明正确的方向。

于 2013-06-23T00:25:44.877 回答