局部变量正在更新类实例变量,不允许在javascript中进行进一步更新
当我在局部变量正在更新类实例变量,不允许在javascript中进行进一步更新,javascript,Javascript,当我在游戏中移动后记录当前棋盘状态时,棋盘无法正确更新。具体来说,makeMove中的tempBoard对游戏状态进行更改。我认为tempBoard只是一个局部变量,只有在调用updateBoard时才会更改实际的板。我知道这一定是我错过了一些简单的东西,但似乎无法理解。谢谢 控制台输出如下: “原件:1,2,3,4,5,6,7,8,9” “旧板:1,2,3,4,5,6,7,8,9” “前临时板:1,2,3,4,5,6,7,8,9” “1,2,3,4,5,6,7,8,X之后的临时板” “来自ma
游戏
中移动后记录当前棋盘状态时,棋盘无法正确更新。具体来说,makeMove
中的tempBoard
对游戏状态进行更改。我认为tempBoard
只是一个局部变量,只有在调用updateBoard
时才会更改实际的板。我知道这一定是我错过了一些简单的东西,但似乎无法理解。谢谢
控制台输出如下:
“原件:1,2,3,4,5,6,7,8,9”
“旧板:1,2,3,4,5,6,7,8,9”
“前临时板:1,2,3,4,5,6,7,8,9”
“1,2,3,4,5,6,7,8,X之后的临时板”
“来自makeMove:1,2,3,4,5,6,7,8,X”
“旧板:1,2,3,4,5,6,7,8,X”
前临时板:1,2,3,4,5,6,7,8,X
“1,2,X,4,5,6,7,8,X之后的临时板”
来自makeMove:1,2,X,4,5,6,7,8,X
旧板:1,2,X,4,5,6,7,8,X
前临时板:1,2,X,4,5,6,7,8,X
“1,2,X,4,X,6,7,8,X后的临时板”
来自makeMove:1,2,X,4,X,6,7,8,X
移动后:1,2,X,4,X,6,7,8,X
旧版:1,2,X,4,X,6,7,8,X
“板复位:1,2,X,4,X,6,7,8,X”
代码如下:
//游戏课
var Game = function(board,playerToken,compToken){
this.board = board;
this.playerToken = playerToken;
this.compToken = compToken;
this.state = new State(board);
this.playerTurn = true;
};
Game.prototype.getPlayerToken = function(){
return this.playerToken;
};
Game.prototype.getCompToken = function(){
return this.compToken;
};
Game.prototype.makeMove = function(move,player){
var moved = false,
tempBoard = this.state.getBoard();
if(this.state.getFreeSpots().indexOf(move) >= 0){
tempBoard[move - 1] = player.getToken();
moved = true;
}
this.state.updateBoard([1,2,3,4,5,6,7,8,9]);
console.log("From makeMove: " + this.state.getBoard());
};
//国家级
var State = function(board){
this.board = board;
};
State.prototype.updateBoard = function(board){
this.board = board;
};
State.prototype.getBoard = function(){
return this.board;
};
State.prototype.getTakenSpots = function(player){
var avail = this.getFreeSpots(),
taken = [1,2,3,4,5,6,7,8,9],
curBoard = this.board;
// Filters out taken positions from 'taken' array
return taken.filter(function(val){
return avail.indexOf(val) < 0;
}).filter(function(val){
return curBoard[val - 1] === player;
});
};
State.prototype.getFreeSpots = function(){
var movesArr = [];
movesArr = this.board.filter(function(x){
return typeof x === "number";
});
return movesArr;
};
//玩游戏
function playGame(){
var board = [1,2,3,4,5,6,7,8,9],
game,
player,
comp,
reset = false,
oldBoard;
var temp = 0,
temp2;
player = new Player('X');
comp = new Player('O');
game = new Game(board, player.getToken(),comp.getToken());
console.log("Original: " + game.state.getBoard());
oldBoard = game.state.getBoard();
console.log("Old board: " + oldBoard);
game.makeMove(9,player);
console.log("Old board: " + oldBoard);
game.makeMove(3,player);
console.log("Old board: " + oldBoard);
game.makeMove(5,player);
console.log("After moves: " + game.state.getBoard());
console.log("OldBoard: " + oldBoard);
//game.state.updateBoard(oldBoard);
console.log("Board reset: " + game.state.getBoard());
}
数组是对象。变量(和属性)不存储对象,它们存储对对象的引用。(把它想象成一个数字,告诉JavaScript引擎对象在哪里。)因此State#getBoard
返回对其实际board
数组的引用,该数组被传递到Game
,而不是它的副本。考虑:
var a=[1,2,3];
console.log(a[0]);//1.
变量b=a;//对同一数组的引用,而不是它的副本
b[0]=42;
console.log(a[0]);//42
tempBoard=this.state.getBoard()
这个声明得到了实际的董事会。tempBoard包含对实际板的引用。
如果您做了任何更改,实际板将更新
宁可
tempBoard = this.state.getBoard().slice()
谢谢你的详细解释!我知道我在分配/检索值的方式上遗漏了一些基本的东西。
tempBoard = this.state.getBoard().slice()