2017-07-27 42 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