函数正在更改错误的变量值

时间:2018-07-27 12:41:25

标签: javascript

我的功能是这样的:

function sortThis(board) {
    tempBoard = board; 
    var moves = []
    for(var i = 0; i < board.length;i++)
    {
        if(tempBoard[i] == "X")
        {
            tempBoard[i] = "Z";
            moves.push(i);
        }
     }
      return moves;

}

但是当我在第8行更改board值时,此代码正在更改tempBoard变量的值。

为什么?这个错误浪费了我2天的时间。

3 个答案:

答案 0 :(得分:2)

这不是错误。在JavaScript中,数组和对象是按引用而不是按值复制的,因此以下行为是正常现象,符合预期:

a = [3];
b = a;
a.push(5);
console.log(b);

tempBoard = board为例,对tempBoard的每次修改也会影响board。 如果要按值复制数组,可以执行以下操作:

a = [3];
b = [...a];
a.push(5);
console.log(b);

答案 1 :(得分:1)

您需要将一个数组复制到另一个数组,因此您必须克隆一个数组。

有多种方法可以做到,例如tempBoard = Object.assign([], board)

选中此link

答案 2 :(得分:0)

当您执行tempBoard = board时,您只是在创建一种新方法来访问board变量后面的数据。它称为pointer。因此,当您修改tempBoard数据时;它将修改board数据。


问题的重演

function sortThis(board) {
  tempBoard = board;

  var moves = []

  for (var i = 0; i < board.length; i++) {
    if (tempBoard[i] === 'X') {
      tempBoard[i] = 'Z';

      moves.push(i);
    }
  }
  
  return moves;
}


const arr1 = ['X', 'Y'];

sortThis(arr1);

console.log(arr1);


一种解决方法是执行板数据的副本,而不是创建指向它的指针

function sortThis(board) {
  const tempBoard = [
    ...board,
  ];

  const moves = []

  for (var i = 0; i < board.length; i++) {
    if (tempBoard[i] === 'X') {
      tempBoard[i] = 'Z';

      moves.push(i);
    }
  }

  return moves;
}


const arr1 = ['X', 'Y'];

sortThis(arr1);

console.log(arr1);


更容易地,您可以使用Array.map()函数从第一个数组创建新数组

function sortThis(board) {
  return board.map(x => x === 'X' ? 'Z' : x);
}


const arr1 = ['X', 'Y'];

const arr2 = sortThis(arr1);

console.log(arr1);

console.log(arr2);