Wie auszunehmen zu Array Methoden aus der Verarbeitung in „for..in“ Schleife hinzugefügt? (JavaScript)

StackOverflow https://stackoverflow.com/questions/1809505

  •  05-07-2019
  •  | 
  •  

Frage

Ich habe einige nützliche Helfer hinzugefügt Array (wie toSource() für Opera). Und jetzt for..in gibt die Funktionen mit normalen Eigenschaften.

Ich bin mit for..in jetzt, da der Code einfacher ist, mit ihm zu lesen. Und es ist eine native funktionelle von js, so muss schneller sein.

Aber das Hinzufügen Typprüfungen in Schleife macht es einfacher, klassischen for(;;) zu verwenden.

Gibt es irgendwelche Methoden for..in enumerate Funktionen zu vermeiden?

Cross-Browser-Arbeit ist nicht sehr notwendig (muss in Opera arbeiten), aber die Geschwindigkeit ist wichtig.

Danke.


Bearbeiten
Gibt es eine Möglichkeit, for..in aufzuzählen Funktionen oder benutzerdefinierte Eigenschaften von jedem Objekt?

zu vermeiden
War es hilfreich?

Lösung

Sie sollten nie Verwendung for..in Array-Elemente iterieren Schleifen. for..in ist für iterieren Eigenschaften und sollte nur dafür verwendet werden, für genau den Grund, warum Sie gerade beschrieben habe. Viele Bibliotheken ändern Array, Datum, etc Prototypen, so dass Sie nicht auf for..in Iterieren nur die Array-Elemente verlassen sollten. Verwenden Sie die für (;;) -Methode, ist es garantiert zu tun, was Sie wollen. Und es ist nicht schneller als eine for..in-Schleife, weil es so gut Javascript nativer ist.

Für weitere Informationen, lesen Sie in der prototype.js Bibliothek.

Andere Tipps

Ja, aber es ist JavaScript 1.7+ - nur. Opera hat nur begrenzt JavaScript 1.7-Unterstützung, die von Destrukturierung Zuordnung sehr grundlegende Unterstützung beinhaltet so dass diese nicht in Opera funktionieren wird, aber es wird in Firefox arbeiten.

Diese Implementierung ermöglicht es sicher mit for [each](item in array):

Array.prototype.__iterator__ = function (flag) {
    var len = this.length, i = 0;

    for (; i < len; i++) {
        yield flag ? i : this[i];
    }
};

Wie andere erwähnt, sollten Sie nicht Arrays verwenden for..in iterieren. Es ist langsamer als mit einer for (;;).

Sie sollten auch die Länge des Arrays gespeichert werden, wenn Sie mit der Leistung betreffen, wie:

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

Verwenden Sie for..in nur über Eigenschaften von Objekten zu durchlaufen. Um die vererbten Eigenschaften auszuschließen, verwenden Sie die hasOwnProperty () Methode:

for (var prop in object)
{
  // Don't include properties inherited from the prototype chain
  if (object.hasOwnProperty(prop))
  {
    ...
  }
}

Es ist eine weitere Option jetzt mit ES5-Unterstützung, es läßt Sie definieren nicht-zählbare Eigenschaften! Es sollte möglich sein (obwohl ich nicht getestet), so etwas zu tun:

Object.defineProperty( Array.prototype, "myNewMethod", {
   value: function(){},
   writable: true,
   enumerable: false, /* this controls for..in visibility */
   configurable: true
});

Was Sie beschreiben, ist genau, warum Sie verwenden

for (var i=0; i<arr.length; i++) { ... }

statt:

for (var item in arr) { ... }

, weil sie anders sind.

Wenn Sie nicht möchten, dass alle Mitglieder, die Sie in der zweiten Form erhalten werden und nur die indizierten Elemente dann das erste Formular.

Edit: korrigiert falsche typeof Nutzung dank @Bergi ‚s Kommentar

guter Punkt, um Leistung, wenn sie über Iterieren (sehr) Sparse-Arrays - Ich würde vorschlagen, dass vielleicht mit isNaN (parseInt ()) in der Schleife können Sie Array-Elemente finden nur:

for( var propertyName in myArray){
    if( !isNaN(parseInt(propertyName)) ){ /* probably array element */ }
}

Ich weiß nicht, was besser von hasOwnProperty führt () und den obigen Ansatz though. Sie müssen einfach nur diese Maßnahme mit einem sehr großen Array es 10000 mal oder so ähnlich iterieren. Wenn Sie einige Performance-Messungen tun, wären die Ergebnisse interessant, so wenden Sie sich bitte teilen! :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top