Soru JavaScript'te bir diziden geç


Java'da bir for Bir dizide nesneleri aşağıdaki gibi hareket ettirmek için döngü:

String[] myStringArray = {"Hello", "World"};
for (String s : myStringArray)
{
    // Do something
}

Aynısını JavaScript'de yapabilir misiniz?


2421
2018-06-10 00:04


Menşei


Tamam, biraz kafam karışmış, nesnelere eriştiğinizde gelişmiş for döngüsünü kullanmak tamam mı? Ve birini doldurmak için sıralı bir tane kullanın? Bu doğru mu? - Mark Szymanski
hayır, gerçekten basit, dizi nesneleri sayısal dizinlere sahip, yani yinelemek Sayısal sıradaki bu indeksler üzerinde, sıralı bir döngü, gelişmiş  for-in döngü numaralandırır Nesne özellikleri, belirli bir sıra olmadan, ve aynı zamanda kalıtsal özellikleri ... yineleme dizilerden ardışık döngüler her zaman tavsiye edilir ... - CMS
ilgili - stackoverflow.com/questions/5349425/... - jondavidjohn
ilgili - stackoverflow.com/q/6208964/31671 - alex
jsben.ch/#/Q9oD5 <= Burada diziler arasında döngü yapmak için bir sürü çözümün bir ölçütü - EscapeNetscape


Cevaplar:


Bir sıralı kullan for döngü:

var myStringArray = ["Hello","World"];
var arrayLength = myStringArray.length;
for (var i = 0; i < arrayLength; i++) {
    alert(myStringArray[i]);
    //Do something
}

@zipcodeman kullanımı for...in deyimi, ancak yinelenen diziler için for-in kaçınılmalıdır, bu ifade saymak nesne özellikleri.

Dizi benzeri nesneler için kullanılmamalıdır çünkü:

  • Yinelemenin sırası garanti edilmez, dizi indeksleri sayısal sıralamada ziyaret edilemez.
  • Devralınan özellikler de sayılır.

İkinci nokta, örneğin, eğer Array.prototype Nesne orada bir yöntem içerecek şekilde, bu özellik de numaralandırılacaktır.

Örneğin:

Array.prototype.foo = "foo!";
var array = ['a', 'b', 'c'];

for (var i in array) {
  alert(array[i]);
}

Yukarıdaki kod "a", "b", "c" ve "foo!" Uyaracaktır.

Yerel prototipler artırmaya (örneğin MooTools gibi) dayanan bir kütüphane kullanıyorsanız, bu özellikle bir sorun olur.

for-in Daha önce de söylediğim gibi saymak nesne özellikleri, örneğin:

var obj = {
  "a": 1,
  "b": 2,
  "c": 3
};

for (var prop in obj) {
  if (obj.hasOwnProperty(prop)) { 
  // or if (Object.prototype.hasOwnProperty.call(obj,prop)) for safety...
    alert("prop: " + prop + " value: " + obj[prop])
  }
}

Yukarıdaki örnekte hasOwnProperty yöntem sadece numaralandırmanızı sağlar kendi mülkleriİşte bu, yalnızca nesnenin fiziksel olarak sahip olduğu özellikler, kalıtsal özelliklerin olmaması.

Aşağıdaki makaleyi okumanızı tavsiye ederim:


3060
2018-06-10 00:07



Neden oy kullanma hakkı? for...inolmalı kaçınılması Dizi benzeri nesneler için! - CMS
Nedeni budur (CMS'nin kendisine göre) stackoverflow.com/questions/1885317/... - OscarRyz
@DoubleGras, bence herkes tarafından paylaşılmayan bir fikir. Görmek: stackoverflow.com/questions/5752906/... veya groups.google.com/forum/?fromgroups#!topic/jsmentors/... - Matthijs Wessels
@StijndeWitt Hayır, çünkü eğer varsa "Falsey" dizinizdeki değerler: false, undefined, 0, "", NaN. - Phrogz
jsperf.com/caching-array-length/4  Javascript döngüsünde bir dizinin uzunluğunu önbelleğe almaya değip değmeyeceğini görmek için bir test - Enrico


Evet, ancak uygulamanız şunları içeriyorsa for...of özellik tanıtıldı ECMAScript 2015 ("Harmony" sürümü).

Bu şekilde çalışır:

// REQUIRES ECMASCRIPT 2015+
var s, myStringArray = ["Hello", "World"];
for (s of myStringArray) {
  // ... do something with s ...
}

Veya daha da iyisi, ECMAScript 2015 ayrıca blok-kapsam değişkenleri üzerinden let ve const:

// REQUIRES ECMASCRIPT 2015+
const myStringArray = ["Hello", "World"];
for (const s of myStringArray) {
  // ... do something with s ...
}
// s is no longer defined here

Birçok JavaScript geliştiricisi hala, henüz orada olmayan bir ortamda çalışıyorlar - özellikle de kodları web tarayıcılarında çalışacak şekilde yazıyorlarsa, site geliştiricileri genellikle hangi tarayıcının / sürümün kullanacağından emin olamazlar.

JavaScript yorumcusu ile uyumlu olduğunu varsayabilir önceki ECMAScript belirtiminin (örneğin, Internet Explorer'ın 9'dan önceki sürümlerini belirleyen) sürümü, ardından forEach döngü yerine yineleyici yöntemi. Bu durumda, dizideki her öğeye çağrılacak bir işlev iletirsiniz:

var myStringArray = [ "Hello", "World" ];
myStringArray.forEach( function(s) { 
     // ... do something with s ...
} );

Ama eğer bu bile varsayılmayacak kadar çoksa ve sende işe yarayan bir şey istiyorsan herşey JavaScript sürümleri, sonra açık bir sayım döngüsü kullanmak zorunda. Seyrek dizileri düzgün bir şekilde işleyen en güvenli sürüm şudur:

var i, s, myStringArray = [ "Hello", "World" ], len = myStringArray.length;
for (i=0; i<len; ++i) {
  if (i in myStringArray) {
    s = myStringArray[i];
    // ... do something with s ...
  }
}

Uzunluk değerini yerel değişkene atama (tam olarak dahil etmek yerine myStringArray.length döngü koşulundaki ifade, her zaman bir özellik aramasını atladığından performans açısından önemli bir fark yaratabilir; Makinemde Rhino kullanarak, hız% 43'tür.

Sıklıkla, döngü başlatma döngüsünde yapılan önbellekleme uzunluğunu görürsünüz, bunun gibi:

var i, len, myStringArray = [ "Hello", "World" ];
for (len = myStringArray.length, i=0; i<len; ++i) {

for...in Başkaları tarafından bahsedilen sözdizimi, bir nesnenin özellikleri üzerinde döngü yapmak içindir; JavaScript'teki bir Array, sayısal özellik adlarına sahip bir nesne olduğundan (ve otomatik olarak güncellendiğinden) lengthözellik), teorik olarak onunla bir Dizi üzerinde döngü yapabilirsiniz. Ancak problem, kendisini sayısal özellik değerleriyle sınırlamamasıdır (yöntemlerin aslında sadece değeri bir kapanış olan özellikler olduğunu unutmayın) ve sayısal düzende olanlar üzerinde yineleme yapmaz. bu yüzden for...in sözdizimi olmalı değil Diziler ile döngü için kullanılır.


871
2018-04-16 02:03



Bazı tercümanların (ör. V8) dizinin uzunluğunu otomatik olarak önleyeceğini unutmayın. Eğer kod yeterli zamanlar denir ve uzunluğun döngü tarafından değiştirilmediğini algılar. Uzunluğunu önbelleğe almak hala güzel olsa da, kodunuz aslında bir fark yaratmak için yeterli sayıda çağrıldığında bir hız artışı sağlayamayabilir. - Phrogz
@ mark-reed Neden kullandığınızı açıklar mısınız i in myStringArray örneğinizde Bu nasıl yanlış olabilir? - Denis V
@DenisV: yanlış. a=[1,2,3,4]; delete a[2]; for (j in a) { console.log(j); }  0, 1, 3 ve 4 çıkışları. a.length hala 5. - Mark Reed
Önermiyorum for j in a. Bunu gösteriyorum in Tüm indeksleri göstererek ve 0 ile 1 arasında bir değer olduğunu göstererek, talep ettiğiniz gibi kontrol gereksiz değildir. length-1 Bu orada değil. Ben de yeni basılmış olabilirim 2 in a, bu gerçekten falsebunun imkansız olduğunu söylediğine rağmen. - Mark Reed
@GrijeshChauhan - doğru. Örneğin, sürüm 8 ile IE bunu desteklemiyor. Görmek bu soru. - Mark Reed


Kullanabilirsiniz mapgibi diğer dillerde de kullanılabilen fonksiyonel bir programlama tekniğidir piton ve Haskell.

[1,2,3,4].map( function(item) {
     alert(item);
})

Genel sözdizimi şöyledir:

array.map(func)

Genel olarak func dizinin bir öğesi olan bir parametre alır. Ancak JavaScript durumunda, maddenin indeksi olan ikinci bir parametre ve dizinin kendisi olan üçüncü bir parametre alabilir.

Dönüş değeri array.map başka bir dizidir, bu şekilde kullanabilirsiniz:

var x = [1,2,3,4].map( function(item) {return item * 10;});

Ve şimdi x [10,20,30,40].

Fonksiyonu satır içi yazmak zorunda değilsiniz. Ayrı bir işlev olabilir.

var item_processor = function(item) {
      // Do something complicated to an item
}

new_list = my_list.map(item_processor);

hangi tür bir eşdeğer olacaktır:

 for (item in my_list) {item_processor(item);}

Hariç new_list.


392
2018-06-10 00:09



Hayır, ama daha güçlü olabilir. Bunu kontrol et: joelonsoftware.com/items/2006/08/01.html - hasen
Bu özel örnek muhtemelen daha iyi kullanılarak uygulanmaktadır Array.forEach. map yeni bir dizi oluşturmak içindir. - harto
@hasen, Array.prototype.map yöntem ECMAScript 5. Baskı Standardının bir parçasıdır, henüz tüm uygulamalarda mevcut değildir (örneğin, IE'den yoksundur), ayrıca yineleme bir dizi üzerinde düşünüyorum Array.prototype.forEach yöntem daha semantik Doğru ... Ayrıca, for-in bildirimi önermeyin lütfen, daha fazla ayrıntı için cevabımı bakın :) - CMS
Arasındaki fark forEach ve map Birincisi iterasyonun sonuçlarını döndürmez. map (bazen a.k.a. collectama çok farklı apply) bir dizinin her bir elemanını karşılık gelen bir sonuca dönüştürmek için açıktır; 1'e 1 haritalama, dolayısıyla adı. Bu dahil tüm operasyonların bir parçası reduce (tüm diziden tek bir sonuç üretir) ve filter (orijinal dizinin bir alt kümesini üretir) vb. Buna karşılık forEach her eleman ile bir şey yapmaz, semantik belirtilmemiş. - Mark Reed
Düşündüğünüzde, aslında bir şeyi haritalamıyorsanız [] .map kullanmak yanıltıcıdır. [] .Enge semantik bir anlam taşır ve aynı üç argümanı da işleve geçirir. - gengkev


JavaScript'te, bir for-in döngüsüne sahip bir Dizilimin içinden geçilmesi tavsiye edilmez, ancak aşağıdaki gibi bir döngü kullanmak daha iyidir:

for(var i=0, len=myArray.length; i < len; i++){}

En iyi duruma getirilmiş (dizi uzunluğunu "önbelleğe alma"). Daha fazla öğrenmek isterseniz, konuyla ilgili yazımı oku.


102
2017-12-07 07:24



myArray.forEach (function (obj) {}); hala en iyisi - Jan Sverre
küçük bir gelişme: kullanabilirsiniz ++i yerine i++ - roberkules
++i modern derleyicilerin uzun bir zamandan beri bir döngü içinde sizin için yaptığınız eski bir okul optimizasyonudur :) stackoverflow.com/a/1547433/1033348 - ngryman
@Jannis .forEach Buna karşı çeşitli şeyler var. 1) yerli değil 2) oldukça pahalı ve overkill gibi görünüyor EVERY endeksi için yeni bir yürütme bağlamı gerektirir (bkz. dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts) - Jose
Bu döngüyü kullanarak dikkatli olmalısınız. Kullanmaya başladım ve yaptığım bir hata yüzünden hatayı izlemek zordu. Böyle iki döngüyü yuvalarsanız: jsfiddle.net/KQwmL/1. Variyeyi iki döngüde farklı şekilde adlandırmaya dikkat etmelisiniz, aksi takdirde ikinci döngü ilk lenin üzerine yazacaktır. - Rui Marques


için (myStringArray öğesinin varsları) {

(Sorunuzu doğrudan cevaplayın: şimdi yapabilirsiniz!)

Diğer cevapların çoğu haklıdır, fakat (bu yazıdan) bahsetmezler. ECMA Komut Dosyası 6 2015 yineleme yapmak için yeni bir mekanizma getiriyor for..of döngü.

Bu yeni sözdizimi, javascript'te bir diziyi yinelemenin en zarif yoludur (yineleme dizinine gerek duymadığınız sürece), ancak tarayıcılar tarafından henüz geniş çapta desteklenmez.

Şu anda Firefox 13+, Chrome 37+ ile çalışıyor ve yerel olarak diğer tarayıcılarla çalışmaz (aşağıdaki tarayıcı uyumluluğuna bakın). Neyse ki JS derleyicilerimiz var Babil) bugün yeni nesil özellikleri kullanmamıza izin veriyor.

Ayrıca Düğümde çalışır (0.12.0 sürümünde test ettim).

Bir diziyi yineleme

// You could also use "let" instead of "var" for block scope.
for (var letter of ["a", "b", "c"]) { 
   console.log(letter); 
}

Nesnelerin bir dizi yinelenen

var band = [
  {firstName : 'John', lastName: 'Lennon'}, 
  {firstName : 'Paul', lastName: 'McCartney'}
];

for(var member of band){
  console.log(member.firstName + ' ' + member.lastName); 
}

Jeneratörün yinelenmesi:

(örnek https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of)

function* fibonacci() { // a generator function
  let [prev, curr] = [1, 1];
  while (true) {
    [prev, curr] = [curr, prev + curr];
    yield curr;
  }
}

for (let n of fibonacci()) {
  console.log(n);
  // truncate the sequence at 1000
  if (n >= 1000) {
    break;
  }
}

Uyumluluk tablosu: http://kangax.github.io/es5-compat-table/es6/#For..of döngüler

spec:  http://wiki.ecmascript.org/doku.php?id=harmony:iterators

}


92
2017-08-11 15:54



ES6 kullanıyorsanız, öneririm const s yerine var s - joeytwiddle


Opera, Safari, Firefox ve Chrome artık birçok ortak döngüyü optimize etmek için bir dizi geliştirilmiş Dizi yöntemini paylaşıyor.

Hepsine ihtiyacınız olmayabilir, ancak çok kullanışlı olabilirler veya her tarayıcı bunları destekliyorsa olabilir.

Mozilla Labs, algoritmaları yayınladı ve WebKit Her ikisini de kullanabilirsiniz, böylece bunları kendiniz ekleyebilirsiniz.

filtre bazı koşulu veya testi tatmin eden bir dizi öğeyi döndürür.

her Her dizi üyesi testi geçerse doğru döner.

bazı Herhangi bir testi geçerse doğru döner.

her biri için her dizi üyesi üzerinde bir işlev çalıştırır ve hiçbir şey döndürmez.

harita forEach gibidir, ancak her eleman için işlemin sonuçlarının bir dizisini döndürür.

Bu yöntemlerin tümü ilk argümanları için bir işlev alırlar ve isteğe bağlı bir ikinci argümana sahiptirler; bu, kapsam üyelerini işlevin içinde döngüde olduğu gibi dizi üyelerine dayatmak istedikleri bir nesnedir.

İhtiyacınız olana kadar görmezden gelin.

indeksi ve lastIndexOf argümanına tam olarak uyan ilk veya son elemanın uygun konumunu bulmak.

(function(){
    var p, ap= Array.prototype, p2={
        filter: function(fun, scope){
            var L= this.length, A= [], i= 0, val;
            if(typeof fun== 'function'){
                while(i< L){
                    if(i in this){
                        val= this[i];
                        if(fun.call(scope, val, i, this)){
                            A[A.length]= val;
                        }
                    }
                    ++i;
                }
            }
            return A;
        },
        every: function(fun, scope){
            var L= this.length, i= 0;
            if(typeof fun== 'function'){
                while(i<L){
                    if(i in this && !fun.call(scope, this[i], i, this))
                        return false;
                    ++i;
                }
                return true;
            }
            return null;
        },
        forEach: function(fun, scope){
            var L= this.length, i= 0;
            if(typeof fun== 'function'){
                while(i< L){
                    if(i in this){
                        fun.call(scope, this[i], i, this);
                    }
                    ++i;
                }
            }
            return this;
        },
        indexOf: function(what, i){
            i= i || 0;
            var L= this.length;
            while(i< L){
                if(this[i]=== what)
                    return i;
                ++i;
            }
            return -1;
        },
        lastIndexOf: function(what, i){
            var L= this.length;
            i= i || L-1;
            if(isNaN(i) || i>= L)
                i= L-1;
            else
                if(i< 0) i += L;
            while(i> -1){
                if(this[i]=== what)
                    return i;
                --i;
            }
            return -1;
        },
        map: function(fun, scope){
            var L= this.length, A= Array(this.length), i= 0, val;
            if(typeof fun== 'function'){
                while(i< L){
                    if(i in this){
                        A[i]= fun.call(scope, this[i], i, this);
                    }
                    ++i;
                }
                return A;
            }
        },
        some: function(fun, scope){
            var i= 0, L= this.length;
            if(typeof fun== 'function'){
                while(i<L){
                    if(i in this && fun.call(scope, this[i], i, this))
                        return true;
                    ++i;
                }
                return false;
            }
        }
    }
    for(p in p2){
        if(!ap[p])
            ap[p]= p2[p];
    }
    return true;
})();

81
2018-06-10 02:43



Ek: IE sürüm 9'dan beri herşeyi destekler, bkz. forEach Yöntemi MSDN - rwitzel


While döngüsünü kullan ...

var i=0, item, items = ['one','two','three'];
while(item = items[i++]){
    console.log(item);
}

günlükleri: 'bir', 'iki', 'üç'

Ve ters sıra için, daha verimli bir döngü

var items = ['one','two','three'], i = items.length;
while(i--){
    console.log(items[i]);
}

günlükleri: 'üç', 'iki', 'bir'

Ya da klasik for döngü

var items = ['one','two','three']
for(var i=0, l = items.length; i < l; i++){
    console.log(items[i]);
}

günlükleri: 'bir', 'iki', 'üç'

Referans: http://www.sitepoint.com/google-closure-how-not-to-write-javascript/


62
2018-01-05 09:15



Dizi elemanlarından herhangi biri false ise, "while" sözdiziminin ilk örneği çalışmaz. - Chris Cooper
... ve bu süre döngü eşdeğerdir: için (var i = 0, item; item = item [i]; i ++), indeks ve öğe değişkenlerini önceden bildirme gereğini ortadan kaldırır ... - Stijn de Witt
@StijndeWitt Ama bunun için geçerlidir: eğer değer falsyişe yaramaz... - yckart
Koleksiyon üzerinde yinelenirken, optimizasyonla ilgilenmeniz gerekir. Sayfa performansını etkileyebileceğinden. - Zaheer Ahmed


giriş

Üniversitedeki zamanımdan beri, Java, JavaScript, Pascal programladım. ABAP, PHP, İlerleme 4GL, C / C ++ ve muhtemelen şu anda düşünemediğim birkaç başka dil.

Hepsinin kendi dilbilimsel sapkınlıkları olsa da, bu dillerden her biri aynı temel kavramların çoğunu paylaşır. Bu kavramlar prosedürleri / fonksiyonları içerir. IF, -statements FOR-oops ve WHILE-loops.


Geleneksel for-loop

Geleneksel for loop'un üç bileşeni vardır:

  1. Başlatma: Gözlem bloğu ilk kez çalıştırılmadan önce yürütülür
  2. Kondisyon: Döngü bloğu yürütülürken her zaman bir koşul denetler ve yanlışsa döngüyü durdurur.
  3. Sonradan: döngü bloğu yürütüldükten sonra her defasında gerçekleştirilir

Bu üç bileşen birbirinden bir ; sembolü. Bu üç bileşenin her biri için içerik isteğe bağlıdır, yani aşağıdakilerin en az olduğu anlamına gelir. for döngü mümkün:

for (;;) {
    // Do stuff
}

Tabii ki, bir if(condition === true) { break; }  ya da if(condition === true) { return; } bunun içinde bir yer for-Çalışmayı durdurmak için.

Genellikle, başlangıç, bir endeks bildirmek için kullanılır, koşul, bu endeksi en az veya en büyük bir değerle karşılaştırmak için kullanılır ve sonradan indeksi artırmak için kullanılır.

for (var i = 0, length = 10; i < length; i++) {
    console.log(i);
}

Geleneksel kullanarak for bir dizi boyunca döngü döngü

Bir diziden geçmenin geleneksel yolu şudur:

for (var i = 0, length = myArray.length; i < length; i++) {
    console.log(myArray[i]);
}

Ya da, geriye doğru döngü yapmayı tercih ederseniz, bunu yaparsınız:

for (var i = myArray.length - 1; i > -1; i--) {
    console.log(myArray[i]);
}

Bununla birlikte, örneğin, bu gibi birçok varyasyon mümkündür:

for (var key = 0, value = myArray[key], length = myArray.length; key < length; value = myArray[++key]) {
    console.log(value);
}

... ya da bu ...

var i = 0, length = myArray.length;
for (; i < length;) {
    console.log(myArray[i]);
    i++;
}

... ya da bu:

var key = 0, value;
for (; value = myArray[key++];){
    console.log(value);
}

En iyi hangisi olursa olsun, büyük ölçüde hem kişisel zevkinize hem de uygulamakta olduğunuz özel kullanım durumuna bağlıdır.

Bu varyasyonların her birinin, çok eski olanlar da dahil olmak üzere tüm tarayıcılar tarafından desteklendiğini unutmayın!


bir while döngü

Bir alternatif for döngü bir whiledöngü. Bir dizi boyunca döngü yapmak için şunu yapabilirsiniz:

var key = 0;
while(value = myArray[key++]){
    console.log(value);
}

Geleneksel gibi for döngüler, while döngüler en eski tarayıcılar tarafından bile desteklenir.

Ayrıca, her zaman döngüsünün bir for döngü. Örneğin, while döngü hereabove bunun gibi aynı şekilde davranır for-loop:

for(var key = 0; value = myArray[key++];){
    console.log(value);
}

For...in ve for...of

JavaScript’te şunları da yapabilirsiniz:

for (i in myArray) {
    console.log(myArray[i]);
}

Ancak bu, geleneksel olarak aynı davranmadığı için dikkatli kullanılmalıdır. for Her durumda döngü ve dikkate alınması gereken potansiyel yan etkileri vardır. Görmek Dizi yineleme ile "for ... in" neden kötü bir fikir kullanıyor? daha fazla ayrıntı için.

Alternatif olarak for...inşimdi de var for...of. Aşağıdaki örnek, bir for...of döngü ve bir for...in döngü:

var myArray = [3, 5, 7];
myArray.foo = "hello";

for (var i in myArray) {
  console.log(i); // logs 0, 1, 2, "foo"
}

for (var i of myArray) {
  console.log(i); // logs 3, 5, 7
}

Ayrıca, Internet Explorer'ın hiçbir sürümünün desteklemediğini düşünmeniz gerekir for...of (Kenar 12+ yapar ve for...in En azından Internet Explorer 10 gerektirir.


Array.prototype.forEach()

Bir alternatif for-oops Array.prototype.forEach()Aşağıdaki sözdizimini kullanan:

myArray.forEach(function(value, key, myArray) {
    console.log(value);
});

Array.prototype.forEach() Internet Explorer 9 ve sonrası gibi tüm modern tarayıcılar tarafından desteklenmektedir.


Kütüphaneler

Son olarak, birçok yardımcı program kütüphanesi de kendi foreach varyasyon. AFAIK, en popüler üç tanesi şunlar:

jQuery.each(), içinde jQuery:

$.each(myArray, function(key, value) {
    console.log(value);
});

_.each(), içinde Underscore.js:

_.each(myArray, function(value, key, myArray) {
    console.log(value);
});

_.forEach(), içinde Lodash.js:

_.forEach(myArray, function(value, key) {
    console.log(value);
});

48
2018-02-29 18:56





Hızlı döngü yazmanın bir ters yolunu istiyorsanız ve ters olarak yineleyebilirsiniz:

for (var i=myArray.length;i--;){
  var item=myArray[i];
}

Bu, uzunluğun önbelleğe alınmasının yararına sahiptir. for (var i=0, len=myArray.length; i<len; ++i) ve aksine for (var i=0; i<myArray.length; ++i)) yazarken daha az karakter olurken.

Tersine yinelemeniz gereken bazı zamanlar da vardır. canlı NodeList Yineleme sırasında DOM'dan öğeleri kaldırmayı planladığınız yer.


35
2018-06-04 16:26



Bu kadar ustaca olmayanı elde edemeyen insanlar için: i-- ifadesi ilk değerlendirilir ve döngüsel olmadığında döngünün devam etmesini sağlar ... Daha sonra sayaç azalır. Sıfır olur olmaz, sıfırdan çıkacaktır, çünkü sıfır, Javascript'teki sahte bir değerdir. - Stijn de Witt
falsish? Falsey'yi kastediyorsun. Karışıklıktan kaçınmak için uygun terminolojiyi kullanalım;) - danwellman
Ben gurular düşünen insanlar tarafından kullanılan falsish terimi gördüm. Onlar için yeterince iyiyse, benim için yeterince iyi. Ayrıca bir yorum ama aslında ontopic olduğunu ve açıklama / içgörü ekler benim yorum görüyorum hayal kırıklığına, ama benim yorumda bir terim nitpicks yorum 4 alır. Ah sadece öncelikleri sadece bir konu sanırım. - Stijn de Witt
"Uzunluğun önbelleğe alınması"? Uzunluk dizide bir tamsayı olarak saklanır, her eriştiğinizde ölçülemez. Uzunluğun değerini başka bir değişkene kopyalamak için burada herhangi bir fayda yoktur. - Mouscellaneous
@ Günümüzde bu günlerde kesinlikle yoktur; JavaScript tarafında uzunluğu önbelleğe alan JavaScript dizilerini yineleyen geçmiş yıllarda (uygulama karşısında ulaşmak yerine) net bir kazanç elde edildi (microoptimizing olduğunda). Örneğin, for (var i=0,len=array.length;i<len;++i) Yazmak için ortak, mantıklı bir döngü oldu. - Phrogz


Döngüsünüzde çok az örtük kapsama sahip olduğunuz ve fazladan değişkenlerle uzaklaştığınız bir yol var.

var i = 0,
     item;

// note this is weak to sparse arrays or falsey values
for ( ; item = myStringArray[i++] ; ){ 
    item; // This is the string at the index.
}

Ya da gerçekten kimliği almak ve gerçekten klasik olmak istiyorsanız for döngü:

var i = 0,
    len = myStringArray.length; // cache the length

for ( ; i < len ; i++ ){
    myStringArray[i]; // Don't use this if you plan on changing the length of the array
}

Modern tarayıcılar tüm yineleyici yöntemleri destekler forEach, map, reduce, filter ve diğer yöntemler bir dizi Dizi prototipi.


26
2018-05-16 22:52



Bazı tercümanların (ör. V8) kodun yeterli sayıda çağrılması durumunda dizinin uzunluğunu otomatik olarak önleyeceğini ve uzunluğun döngü tarafından değiştirilmediğini algıladığını unutmayın. - Phrogz
Bilginin @Phrogz için teşekkürler, VM'nin yapabileceği birçok optimizasyon olduğu doğru, ancak eski tarayıcılar buna sahip olmadığından, bu kadar ucuz olduğu için optimizasyon için en iyi uygulama olacaktır. - Gabriel
@ Gabriel: Neden? Lütfen, uzunluğu önbelleğe almamanın aslında bir performans darboğazı olduğunu gösteren gerçek dünyadaki örnekleri verin. 'Prematüre optimizasyon tüm kötülüklerin köküdür' yaklaşımını takip ediyorum. Karşılaştığımda, aslında bir problem ortaya çıkaran bir döngüyü çözeceğim ... - Stijn de Witt
@StijndeWitt imo sadece bir stilist bir konudur. Dürüst olmak gerekirse, bu şeyleri yapmak için _.each, _.map vb. Gibi şeyler için altçizgiye güvenmek yerine döngüler için bile kullanmıyorum. Bu şekilde döngüler yazdığımda öncelikle uzunluğu önbelleğe aldım, böylece tüm değişken bildirimlerim işlevimin en üstünde bir yerde idi. Bu konuda tavsiyemden sonra herhangi bir gerçek dünya uygulaması için önemsizdir. Prematüre optimizasyon süper kötüdür, ancak optimizasyon stilistik kararlardan kaynaklanıyorsa, bunun gerçekten önemli olduğunu düşünmüyorum. - Gabriel
@Gabriel JavaScript'in harita işlevini dizileri desteklediğine inanıyorum, bunun için ek bir kütüphane eklememize gerek yok. - Noz