2010-05-29 17 views
5

Bu test için Google Chrome kullanıyorum: Sezginin aksine, ilk döngü "dize" 3 kez uyarı verirken, ikinci döngü "sayı" 3 kez uyarır.Değerler yinelenirken, değer bir sayı olduğunda typeof (value) "string" değerini neden döndürür? Javascript

numarray = [1, 2, 3]; 

//for-each loop 
for(num in numarray) 
    alert(typeof(num)); 

//standard loop 
for(i=0; i<numarray.length; i++) 
    alert(typeof(numarray[i])); 

İki döngüyü "sayı" olarak 3 kez uyarmasını beklerdim. İlk döngü Javascript'te nasıl uygulanır? Başka bir deyişle, eğer her biri sözdizimsel şekerse, standart döngü kullanarak eşdeğeri nedir?

Ayrıca, standart bir döngü kullanarak bir nesnenin ad alanı üzerinde yineleme yapmanın bir yolu var mı? İkinci türün bir döngüsünü kullanarak bazı nesnelerin yöntem ve niteliklerinden birine dokunmak istiyorum. Ben Javascript için yeniyim ve herhangi bir yardım çok takdir, teşekkürler.

+0

Ayrıca IE'de 'string' uyarır. – Senthil

+0

olası bir kopyası var mı? [JavaScript dizi dizini bir dize veya tamsayı mı?] (Http://stackoverflow.com/q/27537677/1048572) – Bergi

cevap

6

nedeni ilk döngü içinde geri döndü "dizesini" görüyoruz numdizi indeksi, o değil dizinde numarray değeri ifade etmesidir. İlk döngüsünüzü'u typeof num yerine uyarmak için değiştirmeyi deneyin ve dizinin değerleri değil, göstergeler olan 0, 1 ve 2'yi tükettiğini görürsünüz.

for in döngüsünü kullandığınızda, ikinci örneğinizde for döngüsüne tam olarak eşdeğer olmayan bir nesnenin özelliklerini yinelersiniz. JavaScript'teki diziler, yalnızca özellik adları olarak sıralı sayılara sahip nesnelerdir. typeof söz konusu olduğunda dizgiler olarak ele alınırlar.

Düzenleme: Matta işaret ettiği gibi, bir for in döngü kullanırken herhangi bir sırayla dizideki öğeleri almak için garanti değil ve kısmen bu nedenle, yineleme için tavsiye edilmez

bu şekilde diziler aracılığıyla. Bu davranış göz önüne alındığında, filip-fku, for in kullanımının yararlı olacağını sorar. Bir örnek, mülkiyet adlarının kendilerinin bir anlamı vardır, bu gerçekten dizi belirtileriyle ilgili değildir. Örneğin:

var myName = { 
    first: 'Jimmy', 
    last: 'Cuadra' 
}; 

for (var prop in myName) { 
    console.log(prop + ': ' + myName[prop]); 
} 

// prints: 
// first: Jimmy 
// last: Cuadra 

Ayrıca for in döngüler de nesnenin prototip zincirinde özelliklerini yinelemek edeceğini belirtmek gerekir. Bu nedenle bu bir for in döngü inşa etmek isteyeceği şey genellikle:

for (var prop in obj) { 
    if (obj.hasOwnProperty(prop)) { 
    // do something 
    } 
} 

mülkiyet Prototipi yoluyla devralan ediyor nesnenin kendisi değil, bir nesne tarafından tanımlandı, bu onay görmek için gelmez Zincir.

+2

Dizi öğelerinin sırayla ziyaret edileceğini garanti etmez. MDC'deki [for ... içinde] (https://developer.mozilla.org/en/core_javascript_1.5_reference/Statements/for...in) adresine bakın: "Bir dizinin üzerinde yineleme, sayısal sıradaki öğeleri ziyaret etmeyebilir". Bunun sebebi, diziler için genellikle tavsiye edilmez. –

+0

+1 @Jimmy: Açıklama için teşekkürler. – Senthil

+0

İlginç! C#/Java'dan ne bekleyeceğinden farklı .. Peki, bu, tüm bunları elde ettiğinizde, dizi değerlerinin yerine indeksler olduğunda, standart döngüyü açıkça yazmaktan nasıl daha iyidir? Yani Neden bu kadarını endeksler aldığın halde neden kullanırsın? (Sanırım ilişkisel diziler için bir kullanım görebiliyorum). –

İlgili konular