2009-12-11 19 views
29

Tuval etiketi ile bir Javascript oyunu yapıyorum ve oyuncu konumlarını güncellemek için gelişmiş bir for döngüsünü kullanıyorum. KısacaJavascript'teki garip davranış ... döngü için geliştirildi ...

:

var actors = new Array(); 

var player = new Actor(0, 0, img); 

actors[0] = player; 

function update_positions() { 
    //position 1 
    for(var a in actors) { 
     //position2 
     a.xpos += a.xvel; 
     a.ypos += a.yvel; 
    } 
} 

sadece 1 konumundaki döngüsü, bir aktör [0] .xvel doğru değeri erişebilir dışında. For döngüsü 2 pozisyonunda, a.xvel tanımlanmamıştır. Birisi bana neler olduğunu açıklayabilir mi?

+1

Lütfen bu soruya da bakınız http://stackoverflow.com/questions/1886179/why-does-javascript-turn-array-indexes-into-strings-when-iterating/1886259#1886259 – pramodc84

+3

[Şunlar için kullanma diziler için -in-döngüler] (http://stackoverflow.com/q/500504/1048572) – Bergi

cevap

79

for...in ifadesi kastedilmektedir kodunuzu bakarak, üzerinde nesne özelliklerini yineleme için kullanılmak üzere actors bir Array (dizine 0 ile ilk elemanı ayarlarken) olduğu görülmektedir.

Bu ifade ayrıca crawl up prototip zincirini de kapsayacak, eğer Array.prototype genişletilmişse, özellikler yinelenecek ve yineleme sırası garanti edilmeyecektir.

Ben problems önlemek ve döngü için normal kullanarak yineleme etmenizi öneriyoruz: etmek, yanılıyorum ve actors Dizi değilse

for (var i = 0; i < actors.length; i++) { 
    actors[i].xpos += actor.xvel; 
    actors[i].ypos += actor.yvel; 
} 

, ben hasOwnProperty yöntemi kullanmanızı öneriyoruz

for (var name in object) { 
    if (object.hasOwnProperty(name)) { 
    // 
    } 
} 
+9

+1 Sadece yazdığım şeyi yazdım :-) Gerçekten, gerçekten ** diziler için ** in 'in' kullanmayın. – bobince

+24

Tanrım! tüm web teknolojisi tamamen mantıksız görünüyor. Teşekkürler – Maleev

2

Yalnızca a.xpos yerine actors[a].xpos kullanmayı deneyin.

JavaScript for-in loops hakkında daha fazla bilgi için buraya bakın.

4

Buradaki değerden değil, nesne özelliklerine erişmeye çalışıyorsunuz. dizin, bu durumda '0', for/in döngüsünde 'a' a atanır.

Yapmak istediğiniz şey dizi üyesinin değerine erişmek, yani: aktörler [a]. Bir dizi indeksleri değil üyeleri ile

for(var a in actors) { // a=0 the first time around the loop, 
    actor = actors[a]; // same thing as actors[0]; 
    actor.xpos += actor.xvel; 
    actor.ypos += actor.yvel; 
} 
+0

Teşekkürler.Bundan sonra kendimi kafamı karıştırmak için LiveScript'i çağırmaya başlayacağım. – Spencer

2

for (x in y) yapı yineler:

bu deneyin.

0

Diğer bir seçenek underscore kütüphane kullanmaktır:: maddi nesnenin kendisinde değil yukarı bir yere prototip zincirinde geçmesini sağlamakla

_.each(actors, function(a) { 
    a.xpos += a.xvel; 
    a.ypos += a.yvel; 
}); 

veya alt çizgi kullanmak istemiyorum ama yine JQuery kullanıyorsanız, o zaman yapabilirsiniz: yineleme bu fonksiyonel desen

$.each(actors, function(i, a) { 
    a.xpos += a.xvel; 
    a.ypos += a.yvel; 
}); 

Bir güzel özellik için var kullanabilirsiniz olmasıdır Döngüsün gövdesine atanmış olan döngüde değişkenleri bildirerek, JavaScript'in tek değişkenli kapsam kuralları tarafından ısırılmayı önler.

İlgili konular