我的功能是这样的:
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天的时间。
答案 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)
答案 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);