Don P: forEach

Beitrag lesen

Hallo,

Ja, da es auch mit in arbeitet
https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Objects:Array:forEach

Genau. Der dortige Algorithmus("exactly the one used in Firefox and SpiderMonkey") gibt mir allerdings ein Rätsel auf:

  
if (!Array.prototype.forEach)  
{  
  Array.prototype.forEach = function(fun /*, thisp*/)  
  {  
    var len = this.length >>> 0;     // hä???  
    if (typeof fun != "function")  
      throw new TypeError();  
  
    var thisp = arguments[1];  
    for (var i = 0; i < len; i++)  
    {  
      if (i in this)  
        fun.call(thisp, this[i], i, this);  
    }  
  };  
}  

Anscheinend soll mit var len = this.length >>> 0; die len-Variable durch einen (fingierten) rechts-shift um 0 Bits numerisch gemacht werden. Aber array.length ist doch ohnehin immer numerisch...

Kann mir auch nicht denken, dass das für den Fall vorgesehen ist, dass die length-Eigenschaft gar nicht definiert ist, denn ein Array hat sie ja immer, und da die Funktion eine Methode von Array-Objekten ist, ist length also immer definiert und eben immer bereits numerisch.

Außerdem habe ich mal irgendwo gelesen oder gehört, dass bitweise Operatoren in JavaScript performancemäßig teuer sind, weil numerische Werte immer float-Typen sind und daher für bitweise Operationen zweimal umgeformt werden müssen. Die Zeile hätte ich daher so geschrieben: var len = +this.length;, wenn das denn überhaupt nötig ist, wie gesagt.

Ein Test hat übrigens ergeben, dass die Variante n>>>0 im IE6 schneller ist, im FF3 aber die Variante +n.

Gruß, Don P