Javascript 通过引用传递数组是';行不通

Javascript 通过引用传递数组是';行不通,javascript,arrays,reference,Javascript,Arrays,Reference,我试图通过引用传递一个变量,但它并没有像它应该的那样工作(或者我希望它会这样) 调用callMeMaybe后,boardCopy仍然为空,我不知道为什么。如果我使用boardCopy=board.slice(0)在第一个函数中复制电路板,而在第二个函数中不执行此操作,则它可以工作,但这不是一个选项,因为实际电路板将更大,而callMeAnytime将是一个递归函数,并且更复杂 callMeAnytime(3, [], [1, 0, 1, 1]); function callMeAnytime(

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

调用
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]
    }
}

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


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

正如前面提到的,javascript使用传递值,您可以修改对象元素/属性,但不能替换对象本身。将新数组返回给对象。你必须换成这样

slice不改变原始数组,但返回一个新的“一级” “深度”副本,其中包含从 原始数组

function callMeMaybe(i、board、boardCopy){
如果(板[i]==1){
//boardCopy=board.slice(0);
var长度=电路板长度,
j=0;
boardCopy.length=0;
while(j
那么浏览器开发人员工具中的Javascript调试器对所有这些有何解释呢?无论如何,
boardCopy=…
将局部变量
boardCopy
的值替换为赋值的右侧。为什么您希望它改变调用函数中的任何内容?Javascript甚至没有引用传递语义。引用传递是一个定义良好的参数传递术语。JavaScript不支持按引用传递,只支持按值传递。对于数组和对象,该值是对对象的引用。您可以修改对象本身,但不能为变量指定不同的值(并期望在函数调用后在外部更改)。谢谢,现在就得到它了。:)OP通过值传递数组,这也是他的问题的根源。据我所知,在Javascript中根本不能通过引用传递变量。谢谢,现在就知道了,我会这样做。你也可以使用[].push.apply(boardCopy,board);与循环和条件相反,它往往更快…是的,但根据数组的大小,使用该方法可能会超过最大堆栈。
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);
    }
}