2017-07-27 21 views
0
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”。然后我得到这个:Javascript无法读取现有对象的值?

Uncaught TypeError: Cannot read property 'hp' of undefined at HTMLButtonElement.fight (java.js:291)

为什么不能读取它,这怎么可能?我在代码中为您标记了第291行。

控制台显示:

java.js:289 1  X 

13:53:54.830 java.js:290 -80

回答

1

你可能会遇到这个错误,当x达到0,第一while循环检查对于rightArmy.pikeman[x-1].hp,这与rightArmy.pikeman[-1].hp相同,当x == 0时。 数组通常在-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

+0

但我希望x在每次迭代后都有一个新值,这就是为什么我要调整数组的大小。 –

+0

那么你可以不是这样做: '而(rightArmy.pikeman.length> 0 && rightArmy.pikeman.hp> 1)...' 并丢弃x变量;这是多余的。 – nadavvadan

+0

您提供的两种解决方案都不会改变任何内容,程序仍会抛出相同的错误。 –

0

的关键是,作为@nadavvadan指出,脚本执行X-1在检查前,当x> 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,则不会进行测试。

+0

请注意,此代码可能与您发布的代码有所不同 - 您的旧代码在遇到带有'hp <1'的pikeman'时会从循环中断开。这一个没有。即使他不是低马力的人,他也会永远删除最后一个“派克曼”。我觉得这可能不是预期的行为? 如果你所要做的只是用'hp <1'过滤出长矛兵,并且用'hp> = 1'保留,那么简单的解决办法是这样的: 'var pikemenWithLotsOfHP = rightArmy.pikeman.filter函数(pikeman){return pikeman.hp> = 1})' – nadavvadan