2 Stimmen

for-Schleife zum Setzen der Längenvariablen bei der Konvertierung aus der Nodeliste

Puh! Das war ein langer Titel.

Ich lese gerade das Buch von WROX über professionelles JavaScript für Webentwickler und bin auf diesen Beispielcode gestoßen, und ich frage mich gerade, ob das die beste Vorgehensweise ist:

function convertToArray(nodes) {
   array = new Array();
   for (var i=0, len=nodes.length; i < len; i++) {
      array.push(nodes[i]);
   }
   return array;
}

Die Sache, die mir Kopfzerbrechen bereitet, ist die "len=nodes.length". Liege ich falsch in der Annahme, dass der erste Satz in einer for-Schleife nur einmal ausgeführt wird? Gibt es einen Grund, warum man eine Variable (len) auf die Länge der nodeList setzen sollte, bevor man sie durchläuft? Würden Sie das auch mit einem normalen Array tun?

Gracias

6voto

Vilx- Punkte 100739

Das hat mit der Leistungsfähigkeit zu tun. Eine lokale Variable ist aus mehreren Gründen schneller:

  • Auf die Länge muss in der Schleife immer wieder zugegriffen werden, einmal pro Iteration;
  • Die Suche nach einer lokalen Variable ist schneller als die Suche nach einem Mitglied;
  • Si nodes ein Array ist, dann .length ist eine magische Eigenschaft, deren Abruf etwas länger dauern kann als bei einer Mitgliedsvariablen.
  • Si nodes ein ActiveX-Objekt ist, dann .length kann zu einem Methodenaufruf in das Objekt führen, was der teuerste Vorgang von allen ist.

3voto

Christoph Punkte 157217

Wenn wir schon über Mikro-Optimierungen sprechen, sollten die folgenden noch schneller sein:

function convertToArray(nodes) {
    var i = nodes.length,
        array = new Array(i); // potentially faster than `array = []`
                              //  --  see comments

    while(i--)
        array[i] = nodes[i];

    return array;
}

Er benötigt eine lokale Variable weniger, verwendet eine while und nicht ein for Schleife und verwendet Array-Zuweisung anstelle des Funktionsaufrufs push() .

Auch, weil wir zählen runter wir die Slots des Arrays im Voraus zuweisen, muss die Länge des Arrays nicht bei jedem Iterationsschritt geändert werden, aber nur bei der ersten .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X