Hi,
»» for (var i=0, l=items.length; i<l; i++) { // damit muss items.length nicht bei jedem Durchlauf erneut ausgewertet werden
>
> Grundsätzlich ist mir klar, was du damit erreichen willst. Nur stellt sich mir die Frage, ob die Eigenschaft length einer NodeList tatsächlich jedesmal ausgewertet wird (was dann ja in O(N) laufen würde) oder ob sie nicht eh schon fest gespeichert ist und nur aktualisiert wird (daraus resultiert dann O(1)).
Grundsätzlich haben NodeLists per Definition „live“ zu sein, d.h. Änderungen im DOM müssen sie sofort widerspiegeln.
Sofern man also im DOM nichts macht, ist die Frage berechtigt, ob und wann erneute Lesezugriffe stattfinden müssen.
Kommt dann aber auch darauf an, wie man „nichts“ definiert. Das Ändern des checked-Values ist im Grunde auch schon eine Änderung, die sich bis ins DOM hinein auswirkt, schließlich wird eine Eigenschaft eines DOM-Objektes geändert.
Wenn ich also weiß, dass ich im DOM nichts mache, was sich auf die Anzahl der Elemente innerhalb einer NodeList auswirkt - dann mache ich das immer so, dass ich mir diese Anzahl vorher ein mal ermittle und in einer Variablen zwischenspeichere.
(Den anderen Fall gibt's ja auch - dass du innerhalb der Schleife Operationen im DOM machst, die sich auf die aktuelle NodeList auswirken. Dann bleibt dir manchmal gar keine andere Wahl, als die Anzahl jedes Mal auszuwerten.)
> Hast du eine Idee, wie das in den einzelnen Browsern realisiert ist? Oder wo man solche Browser-Interna nachschlagen könnte?
Zu beidem: Nicht wirklich.
Da die JavaScript-Engines aktueller Browsergenerationen aber in letzter Zeit stark optimiert wurden und auch weiter werden, ist es wohl so, dass es in der Realität nicht allzu viel ausmacht, ob man nun so oder so vorgeht.
Ich habe es mir jedenfalls angewöhnt, die Zahl der Lesezugriffe auf Eigenschaften zu minimieren, weil auch objekt.eigenschaft zu lesen jedes Mal etwas mehr Aufwand verursacht, als einen Wert direkt aus einer Variablen abzufragen.
Das ist letztendlich Mikro-Optimierung, ja. Aber bei JavaScript ist die immer noch relevanter, als in anderen Sprachen wie bspw. PHP.
MfG ChrisB
--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?