Javascript无法读取现有对象的值?

时间:2017-07-27 11:59:30

标签: javascript debugging

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

2 个答案:

答案 0 :(得分:1)

您可能会收到此错误,因为当x到达0时,首先您的while循环检查rightArmy.pikeman[x-1].hp,这与rightArmy.pikeman[-1].hpx == 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则不会被测试。