Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改同一数组中的另一个对象时正在更改的Javascript对象_Javascript_Arrays_Loops_Object - Fatal编程技术网

更改同一数组中的另一个对象时正在更改的Javascript对象

更改同一数组中的另一个对象时正在更改的Javascript对象,javascript,arrays,loops,object,Javascript,Arrays,Loops,Object,可能发生的情况是,播放器[0]。当我更改播放器[1]时,正在更改pHand。pHand(pHand是将包含对象的数组) for(var j=0;j

可能发生的情况是,播放器[0]。当我更改播放器[1]时,正在更改pHand。pHand(pHand是将包含对象的数组)

for(var j=0;j<2;j++){
控制台日志(cardDeck[甲板计数器]);
玩家[0].pHand[j]=cardDeck[deckCounter];
播放器[0]。cardNumber++;
console.log(player[0].pHand[j]);
deckCounter++;
} 
对于(var k=0;k<2;k++){
控制台日志(cardDeck[甲板计数器]);
玩家[1].pHand[k]=cardDeck[deckCounter];
播放器[1]。cardNumber++;
console.log(player[1].pHand[k]);
console.log(player[0].pHand[k]);
deckCounter++;
} 
为了便于解释,我稍微修改了代码(我会有一个用于玩家索引的循环,而不是两个单独的循环),但每次都会出现相同的结果,其中最后一组牌是给每个玩家对象的。 在控制台中,日志通常为,例如:

var pHand = {a:1,b:2};

var player = [];
player[0] = {};
player[1] = {};

player[0].pHand = pHand;
player[1].pHand = pHand; // we assign a REFERENCE here

console.log(player[0].pHand);
console.log(player[1].pHand);

console.log("changing value of b for player 0");
player[0].pHand.b = 3;

console.log(player[0].pHand);
console.log(player[1].pHand);
// both consolel logs above will be identical!
卡片{套装:“心”,脸值:“10”,值:10,播放:假,img:“10Heart.png”…}

卡片{套装:“心”,脸值:“10”,值:10,播放:假,img:“10Heart.png”…}

卡片{套装:“心”,脸值:“3”,值:3,播放:假,img:“3Heart.png”…}

卡片{套装:“心”,脸值:“3”,值:3,播放:假,img:“3Heart.png”…}

牌{套装:“黑桃”,面额:“J”,面额:10,玩过的:假,img:“JSpade.png”…}

牌{套装:“黑桃”,面额:“J”,面额:10,玩过的:假,img:“JSpade.png”…}

牌{套装:“黑桃”,面额:“J”,面额:10,玩过的:假,img:“JSpade.png”…}

卡片{套装:“黑桃”,面额:“K”,面额:10,玩过的:假,img:“KSpade.png”…}

卡片{套装:“黑桃”,面额:“K”,面额:10,玩过的:假,img:“KSpade.png”…}

卡片{套装:“黑桃”,面额:“K”,面额:10,玩过的:假,img:“KSpade.png”…}


任何帮助或见解都将不胜感激:)

Javascript通常在分配变量时使用引用,并且您将相同的cardDeck对象分配给两个播放器的pHand属性。例如:

var pHand = {a:1,b:2};

var player = [];
player[0] = {};
player[1] = {};

player[0].pHand = pHand;
player[1].pHand = pHand; // we assign a REFERENCE here

console.log(player[0].pHand);
console.log(player[1].pHand);

console.log("changing value of b for player 0");
player[0].pHand.b = 3;

console.log(player[0].pHand);
console.log(player[1].pHand);
// both consolel logs above will be identical!
关于“如何克隆”js对象,您可以查看以下帖子:

只要对象是可序列化的(例如,不包含函数,只包含数组和对象),您就可以使用它来创建简单的深度副本:

player[0].pHand = JSON.parse(JSON.stringify(pHand));

完整示例:

这并不奇怪,因为您将两者都设置为
cardDeck[deckCounter]
,这可能是完全相同的对象。在两个数组中对同一对象的引用意味着在一个位置更改该对象,在其他位置也会更改该对象。如果您不想将一个对象的更改反映到另一个指定的对象中,则必须先克隆该对象,然后再将其指定给另一个对象。非常感谢!我和我所有的计算机老师花了一个小时才弄明白这一点!