if (rightArmy.pikeman.length > 0) {
x = rightArmy.pikeman.length;
console.log(x + " X");
console.log(rightArmy.pikeman[0].hp);
/*291*/ while (rightArmy.pikeman[x-1].hp < 1 && x>0) {
rightArmy.pikeman.pop();
x--;
}
}
rightArmy.pikeman是一个数组,最后一个console.log显示rightArmy.pikeman [0]的值“hp”为“-80”。这意味着rightArmy.pikeman [0]必须存在。在此之前我用console.log检查X的值,结果是“1”。然后我明白了:
未捕获的TypeError:无法读取未定义的属性'hp' 在HTMLButtonElement.fight(java.js:291)
为什么它不能读它,这怎么可能?我在代码中为你标记了第291行。
控制台显示:
java.js:289 1 X
13:53:54.830 java.js:290 -80
答案 0 :(得分:1)
您可能会收到此错误,因为当x
到达0
时,首先您的while循环检查rightArmy.pikeman[x-1].hp
,这与rightArmy.pikeman[-1].hp
时x == 0
相同1}}。
数组通常在-1
索引处未定义。
一个简单的解决方法是改变while循环中条件的顺序 -
while (rightArmy.pikeman[x-1].hp < 1 && x>0)
会变成
while (x>0 && rightArmy.pikeman[x-1].hp < 1)
,
或将x初始化为rightArmy.pikeman.length - 1
。
答案 1 :(得分:0)
关键是,正如@nadavvadan指出的那样,脚本在检查x&gt;之前是否执行x-1。 0,所以我解决了这样的问题(因为更改订单不起作用):
if (rightArmy.pikeman.length > 0) {
x = rightArmy.pikeman.length;
while (x>0) {
if (rightArmy.pikeman[x-1].hp < 1) {
rightArmy.pikeman.pop();
}
x--;
}
}
这样,“x-1”条件在循环内部,如果X = 0则不会被测试。