Schleifen programmieren

Problem

Sie rufen $.each(array,fn) oder $(selector).each(fn) auf, um in Ihrem Code über tausende von Elementen zu iterieren, und vermuten, dass all diese Funktionsaufrufe das Laden Ihrer Seite verlängern:

$.each( array, function() {
    // tue etwas mit this
});

oder

$('.lotsOfElements').each( function() {
    // tue etwas mit this oder $(this)
});

Lösung

Verwenden Sie eine for-Schleife anstelle von .each() . Um über ein Array zu iterieren, gibt es kaum eine schnellere Möglichkeit:

for( var item, i = −1; item = array[++i] ) {
    // tue etwas mit item
}

Aber sie hat einen Nachteil: diese Schleife funktioniert nur, wenn Ihr Array keine »leeren« Elemente enthält, also Elemente, deren Wert undefined, null, false, 0 oder "" ist. Selbst mit dieser Einschränkung ist diese Schleife jedoch in vielen häufig auftretenden Situationen nützlich, zum Beispiel beim Iterieren über ein jQuery-Objekt. Stellen Sie nur sicher, dass Sie das Objekt in einer Variablen puffern:

var $items = $('.lotsOfElements');
for( var item, i = −1; item = $item[++i] ) {
    // tue etwas mit item (ein DOM-Knoten)
}

Häufig liegen auch JSON-Daten vor, die ein Array mit Objekten enthalten – wie bei unserem Beispiel aus Tabellen schneller laden:

{
    "names": [
        {
            // ...
            "zip": "48786"
        },
        // für 1000 Namen wiederholt
    ]
}

Wenn Sie wissen, dass keines dieser Objekte, die das Array names aufbauen, jemals null sein wird, können Sie die schnelle Schleife nutzen.

Ein allgemeinerer Ansatz, der mit jedem Array funktioniert, ist die klassische Schleife, aud die Sie immer wieder stoßen werden:

for( var i = 0; i < array.length; i++ ) {
     var item = array[i];
    // tue etwas mit item
}

Doch diese Schleife lässt sich trotzdem auf unterschiedliche Weisen verbessern:

  • Puffern der Arraylänge
  • Verwenden von ++i, was in manchen Browsern schneller ist als i++
  • Kombinieren des Tests mit der Erhöhung der Schleifenvariablen zur Vermeidung eines Name Lookups

Das Ergebnis ist:

for( var i = −1, n = array.length; ++i < n; ) {
    var item = array[i];
    // tue etwas mit item
}

Note

Wäre es vielleicht sogar noch schneller, eine while-Schleife oder eine do...while-Schleife zu nutzen? Wahrscheinlich nicht. Sie könnten die eben angeführte Schleife auch wie folgt schreiben:

var i = −1, n = array.length;
while( ++i < n ) {
    var item = array[i];
    // tue etwas mit item
}

oder

var i = 0, n = array.length;
if( i < n ) do {
    var item = array[i];
    // tue etwas mit item
}
while( ++i < n );

Aber keine davon ist schneller als die besser lesbare for-Schleife.


Um über ein Objekt (kein Array) zu iterieren, können Sie eine for..in-Schleife verwenden:

for( var key in object ) {
    var item = object[key];
    // tue etwas mit item
}


Diskussion

$(selector).each(fn) ist der übliche Weg, ein jQuery-Objekt zu erzeugen und darüber zu iterieren, aber es ist nicht der einzige. Das jQuery-Objekt ist ein »Array-ähnliches« Objekt mit einer .length-Eigenschaft und [0], [1], ..., [length-1]. Daher können Sie beliebige Schleifen nutzen, die Sie auch bei anderen Arrays verwenden. Und da das jQuery-Objekt niemals »leere« Elemente enthält, können Sie die am Anfang dieser Lösung präsentierte, schnellste for-Schleife verwenden.

Wenn Sie die Funktion time() aus Was ist an $(this) falsch? oder einen anderen Profiler nutzen, um die Performance von Schleifen zu messen, sollten Sie auf jeden Fall den »echten« Code testen, keine vereinfachte Testversion, die nur die Schleife ohne den Schleifenrumpf testet. Diese vereinfachten Tests würden einen potenziellen Vorteil der for-Schleife übersehen: Weniger Name Lookups aufgrund einer reduzierten Funktionsverschachtelung. In Name Lookups verringern finden Sie mehr Details dazu.

JQuery Kochbuch
titlepage.xhtml
part0000.html
part0001.html
part0002_split_000.html
part0002_split_001.html
part0002_split_002.html
part0003_split_000.html
part0003_split_001.html
part0003_split_002.html
part0003_split_003.html
part0003_split_004.html
part0003_split_005.html
part0003_split_006.html
part0003_split_007.html
part0004_split_000.html
part0004_split_001.html
part0004_split_002.html
part0004_split_003.html
part0004_split_004.html
part0004_split_005.html
part0004_split_006.html
part0004_split_007.html
part0004_split_008.html
part0004_split_009.html
part0004_split_010.html
part0004_split_011.html
part0004_split_012.html
part0004_split_013.html
part0004_split_014.html
part0004_split_015.html
part0004_split_016.html
part0004_split_017.html
part0004_split_018.html
part0005_split_000.html
part0005_split_001.html
part0005_split_002.html
part0005_split_003.html
part0005_split_004.html
part0005_split_005.html
part0005_split_006.html
part0005_split_007.html
part0005_split_008.html
part0005_split_009.html
part0005_split_010.html
part0005_split_011.html
part0005_split_012.html
part0005_split_013.html
part0006_split_000.html
part0006_split_001.html
part0006_split_002.html
part0006_split_003.html
part0006_split_004.html
part0006_split_005.html
part0006_split_006.html
part0006_split_007.html
part0006_split_008.html
part0006_split_009.html
part0006_split_010.html
part0007_split_000.html
part0007_split_001.html
part0007_split_002.html
part0007_split_003.html
part0007_split_004.html
part0007_split_005.html
part0007_split_006.html
part0007_split_007.html
part0007_split_008.html
part0007_split_009.html
part0007_split_010.html
part0007_split_011.html
part0008_split_000.html
part0008_split_001.html
part0008_split_002.html
part0008_split_003.html
part0008_split_004.html
part0008_split_005.html
part0008_split_006.html
part0008_split_007.html
part0008_split_008.html
part0008_split_009.html
part0008_split_010.html
part0008_split_011.html
part0008_split_012.html
part0008_split_013.html
part0008_split_014.html
part0008_split_015.html
part0008_split_016.html
part0008_split_017.html
part0008_split_018.html
part0008_split_019.html
part0008_split_020.html
part0008_split_021.html
part0008_split_022.html
part0009_split_000.html
part0009_split_001.html
part0009_split_002.html
part0009_split_003.html
part0009_split_004.html
part0009_split_005.html
part0009_split_006.html
part0009_split_007.html
part0009_split_008.html
part0009_split_009.html
part0009_split_010.html
part0010_split_000.html
part0010_split_001.html
part0010_split_002.html
part0010_split_003.html
part0010_split_004.html
part0010_split_005.html
part0010_split_006.html
part0010_split_007.html
part0010_split_008.html
part0010_split_009.html
part0010_split_010.html
part0010_split_011.html
part0011_split_000.html
part0011_split_001.html
part0011_split_002.html
part0011_split_003.html
part0011_split_004.html
part0011_split_005.html
part0011_split_006.html
part0011_split_007.html
part0011_split_008.html
part0011_split_009.html
part0011_split_010.html
part0011_split_011.html
part0012_split_000.html
part0012_split_001.html
part0012_split_002.html
part0012_split_003.html
part0012_split_004.html
part0012_split_005.html
part0012_split_006.html
part0012_split_007.html
part0012_split_008.html
part0013_split_000.html
part0013_split_001.html
part0013_split_002.html
part0013_split_003.html
part0013_split_004.html
part0013_split_005.html
part0013_split_006.html
part0013_split_007.html
part0013_split_008.html
part0013_split_009.html
part0013_split_010.html
part0013_split_011.html
part0013_split_012.html
part0014_split_000.html
part0014_split_001.html
part0014_split_002.html
part0014_split_003.html
part0014_split_004.html
part0014_split_005.html
part0014_split_006.html
part0014_split_007.html
part0014_split_008.html
part0014_split_009.html
part0014_split_010.html
part0014_split_011.html
part0015_split_000.html
part0015_split_001.html
part0015_split_002.html
part0015_split_003.html
part0015_split_004.html
part0015_split_005.html
part0015_split_006.html
part0015_split_007.html
part0015_split_008.html
part0015_split_009.html
part0015_split_010.html
part0016_split_000.html
part0016_split_001.html
part0016_split_002.html
part0016_split_003.html
part0016_split_004.html
part0016_split_005.html
part0016_split_006.html
part0016_split_007.html
part0016_split_008.html
part0016_split_009.html
part0017_split_000.html
part0017_split_001.html
part0017_split_002.html
part0017_split_003.html
part0017_split_004.html
part0017_split_005.html
part0017_split_006.html
part0017_split_007.html
part0017_split_008.html
part0017_split_009.html
part0017_split_010.html
part0017_split_011.html
part0018_split_000.html
part0018_split_001.html
part0018_split_002.html
part0018_split_003.html
part0018_split_004.html
part0018_split_005.html
part0018_split_006.html
part0019_split_000.html
part0019_split_001.html
part0019_split_002.html
part0019_split_003.html
part0019_split_004.html
part0019_split_005.html
part0019_split_006.html
part0019_split_007.html
part0019_split_008.html
part0019_split_009.html
part0019_split_010.html
part0020_split_000.html
part0020_split_001.html
part0020_split_002.html
part0020_split_003.html
part0020_split_004.html
part0020_split_005.html
part0020_split_006.html
part0020_split_007.html
part0020_split_008.html
part0021_split_000.html
part0021_split_001.html
part0021_split_002.html
part0021_split_003.html
part0021_split_004.html
part0021_split_005.html
part0021_split_006.html
part0021_split_007.html
part0021_split_008.html
part0021_split_009.html
part0022.html
part0023.html
part0024.html
part0025.html