在JavaScript中设置布尔变量时出现不可预测的行为[严格模式下的深度复制]
我在VisualStudio中调试它,而j的值为1。因此,computerLands[1]应设置为true 相反,它设置了computerLands[1]。tapped=true和computerLands[3]。tapped=true。 这不是每次都会发生,但是很多次,因此我看不出问题出在哪里 computerLands最初是一个空数组,然后动态地将对象推入其中 如果有人知道这可能是什么问题,我会非常感激 编辑:这是填充computerLands的代码:在JavaScript中设置布尔变量时出现不可预测的行为[严格模式下的深度复制],javascript,boolean,windows-8.1,windows-store,Javascript,Boolean,Windows 8.1,Windows Store,我在VisualStudio中调试它,而j的值为1。因此,computerLands[1]应设置为true 相反,它设置了computerLands[1]。tapped=true和computerLands[3]。tapped=true。 这不是每次都会发生,但是很多次,因此我看不出问题出在哪里 computerLands最初是一个空数组,然后动态地将对象推入其中 如果有人知道这可能是什么问题,我会非常感激 编辑:这是填充computerLands的代码: computerLands[j].t
computerLands[j].tapped = true;
将其推入computerLands后,通过splice()将其从computerHand上拆下
最后我找到了一个解决方案,我从这个页面得到: 它描述了如何在Windows应用商店应用程序中深度复制Javascript(我发现的另一个解决方案在Windows应用商店应用程序严格模式下是不允许的),基本上是创建一个新对象并将每个属性复制到其中。下面是我的新工作代码:
var index = computerHand.indexOf(computerHand[i]);
computerHand.splice(index,1);
函数populateComputerLands(){
对于(变量i=0;i<4;i++){
//computerLands.push(可用的计算机卡[0]);可能是computerLands[1]
和computerLands[3]
指向同一个对象?发布填充数组的代码可以让我们确定。@FrédéricHamidi我添加了代码。你确定computerLands在此函数之前为空吗?@Jono声明如下:var computerLands=[];然后我推送()。我如何确保它是空的,有什么区别?当然var index=computerHand.indexOf(computerHand[I]);
只会导致index==I
(除非可以重复输入)
function computerTurn() {
untapAll("computer");
drawCards(1, "computer");
for (var i = 0; i < computerHand.length; i++) {
if (computerHand[i].type === "land") {
var container = document.getElementById("computerLandsContainer");
var newItem = document.createElement("div");
newItem.id = computerLandsID;
computerLandsID++;
newItem.style.backgroundImage = "url("+computerHand[i].image+")";
newItem.style.backgroundSize = "100%";
var btn1 = document.createElement("button");
btn1.id = "tapButtonComputer";
btn1.innerText = "˜";
newItem.appendChild(createEnlargeButton(newItem,"computer"));
newItem.appendChild(btn1);
container.appendChild(newItem);
computerLands.push(computerHand[i]);
console.log("Computer plays: " + computerHand[i].name);
computerLands[computerLands.length - 1].id = newItem.id;
var index = computerHand.indexOf(computerHand[i]);
computerHand.splice(index,1);
break;
}
}
}
computerLands.push(computerHand[i]);
var index = computerHand.indexOf(computerHand[i]);
computerHand.splice(index,1);
function populateComputerLands() {
for (var i = 0; i < 4; i++) {
//computerLands.push(availableComputerCards[0]); <--- old code
var objectToCopy = availableComputerCards[0]; // new code
var newObject = Object.create(Object.getPrototypeOf(objectToCopy));
var newObjectProperties = Object.getOwnPropertyNames(objectToCopy);
var propertyName;
for (var p in newObjectProperties) {
propertyName = newObjectProperties[p];
Object.defineProperty(newObject, propertyName, Object.getOwnPropertyDescriptor(objectToCopy, propertyName));
};
computerLands.push(newObject);
}
}