Javascript 每次我移动河内js的两座塔时,都会同时更新两座塔

Javascript 每次我移动河内js的两座塔时,都会同时更新两座塔,javascript,constructor,towers-of-hanoi,Javascript,Constructor,Towers Of Hanoi,我正在尝试编写一个非常简单的河内之塔谜题的实现,以实践我刚刚学到的关于js构造函数和原型的知识。目前我写的东西有问题,因为每次我把一张“光盘”从塔[0]移动到塔[1],我的塔[2]也会用同一张光盘更新。而且,当我尝试做一个无效的移动时,我仍然会得到我试图移动的光盘,从它的塔架上拿走。我已经检查了我的逻辑,我看不出有任何错误(我可能在这一点上也有偏见)。我想知道这是否是我的构造函数或任何方法的问题 这是我的代码: function TowersOfHanoi(numberOfTowers){

我正在尝试编写一个非常简单的河内之塔谜题的实现,以实践我刚刚学到的关于js构造函数和原型的知识。目前我写的东西有问题,因为每次我把一张“光盘”从塔[0]移动到塔[1],我的塔[2]也会用同一张光盘更新。而且,当我尝试做一个无效的移动时,我仍然会得到我试图移动的光盘,从它的塔架上拿走。我已经检查了我的逻辑,我看不出有任何错误(我可能在这一点上也有偏见)。我想知道这是否是我的构造函数或任何方法的问题

这是我的代码:

function TowersOfHanoi(numberOfTowers){
   let towersQuant = numberOfTowers || 3 , towers;
   towers = Array(towersQuant).fill([]); 
   towers[0] =  Array(towersQuant).fill(towersQuant).map((discNumber, idx) => discNumber - idx);
   this.towers = towers;
}

TowersOfHanoi.prototype.displayTowers = function(){
    return this.towers; 
}


TowersOfHanoi.prototype.moveDisc = function(fromTower,toTower){
    let disc = this.towers[fromTower].pop();
    if(this.isValidMove(disc,toTower)){
       this.towers[toTower].push(disc); 
       return 'disc moved!'
    } else {
        return 'disc couldn\'t be moved.'
    }
}

TowersOfHanoi.prototype.isValidMove = function(disc,toTower){
    if(this.towers[toTower][toTower.length-1] > disc || this.towers[toTower].length === 0){
        return true; 
    }else {
        return false;  
    }
}
这就是我正在测试的:

let game2 = new TowersOfHanoi();
console.log(game2.displayTowers());  
console.log(game2.moveDisc(0,1));  
console.log(game2.displayTowers());  
console.log(game2.moveDisc(0, 2));
console.log(game2.displayTowers()); 
以及我的输出:

[ [ 3, 2, 1 ], [], [] ]
disc moved!
[ [ 3, 2 ], [ 1 ], [ 1 ] ]
disc couldn't be moved.
[ [ 3 ], [ 1 ],[ 1 ] ]

我感谢任何指导。我不一定在寻找代码。只是为了理解。谢谢

数组
fill()
中的这句话告诉您问题:

当fill方法传递一个对象时,它将复制引用并用对该对象的引用填充数组

数组是对象。因此,您所做的是将第一个数组的引用复制到其他每个数组。当您迭代这些引用以修改它们时,整个过程就变得复杂了

更新 类似这样的方法会奏效:

function TowersOfHanoi(numberOfTowers){
   let towersQuant = numberOfTowers || 3 , towers = [];
   for(let i=1; i < towersQuant; i++){
     towers.push([]);
     towers[0].push(i);
   }
  towers[0].reverse();
  this.towers = towers;
}
HANOI功能塔(塔数){ 设towersQuant=塔数| | 3,塔数=[]; for(设i=1;i我的荣幸。很乐意帮忙。
function TowersOfHanoi(numberOfTowers){
   let towersQuant = numberOfTowers || 3 , towers = [];
   for(let i=1; i < towersQuant; i++){
     towers.push([]);
     towers[0].push(i);
   }
  towers[0].reverse();
  this.towers = towers;
}