Javascript 为什么可以';我不能用JS复制这个2d数组吗?我怎样才能复印?

Javascript 为什么可以';我不能用JS复制这个2d数组吗?我怎样才能复印?,javascript,arrays,multidimensional-array,copy,conways-game-of-life,Javascript,Arrays,Multidimensional Array,Copy,Conways Game Of Life,我正在实施约翰·康威的人生游戏,但我遇到了一个奇怪的问题。如果代码给我带来麻烦,下面是一个简短的版本: let lifeMap = [ [true, false, false], [false, false, false], [false, false, false] ]; let oldLifeMap = lifeMap.slice(); for (let row = 0; row < lifeMap.length; row++) { for (let val = 0;

我正在实施约翰·康威的人生游戏,但我遇到了一个奇怪的问题。如果代码给我带来麻烦,下面是一个简短的版本:

let lifeMap = [
  [true, false, false],
  [false, false, false],
  [false, false, false]
];
let oldLifeMap = lifeMap.slice();
for (let row = 0; row < lifeMap.length; row++) {
  for (let val = 0; val < lifeMap[row].length; val++) {
    let bool = lifeMap[row][val];
    let newBool = false; // here is where I would determine if cell is alive/dead
    lifeMap[row][val] = newBool;
    if (row === 0 && val === 0) console.log("at (0,0)", oldLifeMap[0][0]);
  }
}
let lifeMap=[
[真,假,假],
[假,假,假],
[假,假,假]
];
让oldLifeMap=lifeMap.slice();
for(让row=0;row
作为对该代码的响应,JavaScript在(0,0)false处打印
。我需要它一直保持
true
,直到下一代开始

我原以为做
let oldLifeMap=lifeMap.slice()
可以解决这个问题,但事实并非如此,我也不知道为什么。(它不应该复制二维数组而不创建第二个引用吗?)

无论如何,这里发生了什么,我如何成功地在这里复制
lifeMap

您可以如下克隆ND(深度嵌套)数组

Array.prototype.clone = function(){
  return this.map(e => Array.isArray(e) ? e.clone() : e);
};
或者如果你不想修改Array.prototype,你可以简单地重构上面的代码,如下所示

function cloneArray(a){
  return a.map(e => Array.isArray(e) ? cloneArray(e) : e);
};
帽尖对于N维阵列是很好的,但是对于2D阵列来说,帽尖是不必要的。要深入克隆特定的二维阵列,只需执行以下操作:

let oldLifeMap = lifeMap.map(inner => inner.slice())

这将使用无参数的
.slice()
创建每个内部数组的副本,并将其存储到使用
.map()

创建的外部数组的副本外部数组是一个副本,但每个内部数组仍然是一个引用。这是你所做的预期行为。明白了。那么我该如何制作深度拷贝呢?
.map(a=>a.slice())
可能重复
var copy=JSON.parse(JSON.stringify(lifeMap))
有趣的提议,但在我看来对于2D数组来说太过通用了,它不需要递归函数。@Patrick Roberts
Array.prototype
上面的扩展只是为了说明该算法。当然,这必须由
Object.defineProperty()
完成。大家一致认为,最好将其实现为静态
Array.clone()