【发布时间】:2020-02-29 07:16:57
【问题描述】:
const queenThreat = function (board) {
let collision = false;
let newBoard = board.slice(0);
// Horizontal
let horizontal = newBoard[whiteQueen[0]];
horizontal.splice(5, 1, 0);
collision = horizontal.includes(1)
return board;
// Original array
[ [ 0, 0, 0, 0, 0, 1, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 1, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0 ] ]
// Original array after above code despite cloning the array and only accessing the cloned array
[ [ 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 1, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0 ],
[ 0, 0, 0, 0, 0, 0, 0, 0 ] ]
我已经使用 slice() 克隆了我的数组,在 //Horizontal 下访问它而不是原始数组,但是当我返回原始数组时,它仍然被修改。我究竟做错了什么?我已经尝试了各种方法来创建数组的克隆,尽管从未访问过它,但它们都以某种方式修改了原始数组。
【问题讨论】:
-
搜索:"[javascript] array shallow clone"。有 许多 个重复项。
-
stackoverflow.com/a/597726/2864740 的第一段看起来很简洁(数组也是对象)。
-
在数字数组中,使用
.slice()将生成一个新数组,无论如何修改,都不会影响原始数组。但是您有一个 数组 数组。具体来说,对数组的引用数组。您确实复制了数组,但新数组与旧数组具有相同的引用 - 指向相同的数据。他们仍然指向相同的数据。如果您希望它们不发生变化,您将需要对所有内部数组的新副本的新引用。
标签: javascript