Javascript for循环修改错误的数组

Javascript for循环修改错误的数组,javascript,loops,Javascript,Loops,我正在尝试为tic tac toe构建一个AI,这是我第一次做任何类型的AI,我很难弄清楚如何让AI在给定的情况下尝试每一个不同的动作(板)。 “E”是空单元格,我将它们的索引存储在一个名为available的数组中。 AI移动将在nextBoard变量中插入“O”,每次插入一次可用数组提供的索引。 这个函数既修改了nextBoard变量,我想通过给它一个分数来评估下一个AI动作,也修改了真实的board变量,我用它来评估游戏的状态 function AiPossibleActions () {

我正在尝试为tic tac toe构建一个AI,这是我第一次做任何类型的AI,我很难弄清楚如何让AI在给定的情况下尝试每一个不同的动作(板)。 “E”是空单元格,我将它们的索引存储在一个名为available的数组中。 AI移动将在nextBoard变量中插入“O”,每次插入一次可用数组提供的索引。 这个函数既修改了nextBoard变量,我想通过给它一个分数来评估下一个AI动作,也修改了真实的board变量,我用它来评估游戏的状态

function AiPossibleActions () {
  available=[0,1,2,3,5,6,7,8];
  board=["E","E","E","E","X","E","E","E","E"];
  var nextBoard=board
  for (var i=0; i<available.length; i++) {
    nextBoard = board;
    nextBoard[available[i]]="O";
  }
  oMovesCount++
}
理想的输出是,对于每次迭代,变量nextBoard等于:

//1st iteration
["O", "E", "E", "E", "X", "E", "E", "E", "E"]
//2nd iteration
["E", "O", "E", "E", "X", "E", "E", "E", "E"]
//3rd iteration
["E", "E", "O", "E", "X", "E", "E", "E", "E"]
//4th iteration
["E", "E", "E", "O", "X", "E", "E", "E", "E"]
//5th iteration
["E", "E", "E", "E", "X", "O", "E", "E", "E"]
//6th iteration
["E", "E", "E", "E", "X", "E", "O", "E", "E"]
//7th iteration
["E", "E", "E", "E", "X", "E", "E", "O", "E"]
//8th iteration
["E", "E", "E", "E", "X", "E", "E", "E", "O"]

您可能会遇到这样的问题:对象在javascript中是浅拷贝,所以

var nextBoard=board
不复制电路板,但只复制阵列的引用

在您的情况下,如果您需要一份副本,那么您可以使用
slice
,如

var nextBoard=board.slice()

(在循环中也是如此),但如果数组元素本身就是对象,则必须更加详细。

这应该告诉您,您实际上正在修改同一数组,并且需要找到一种不同的方法来制作副本,因为显然单靠赋值是不行的。JavaScript通过引用存储对象,不是值,当您执行
nextBoard=board
时,nextBoard不是board的副本,而是board。或者数组是2d数组。这是有效的。谢谢你,索伦。
var nextBoard=board.slice()