2013-02-18 10 views
29

ECMAScript 5 die array.forEach(callback[, thisArg]) ist sehr bequem auf einem Array zu durchlaufen und viele Vorteile gegenüber der Syntax mit einem für hat:Warum gibt es in ECMAScript 5 keine forEach-Methode für Object?

  • Es ist prägnanter.
  • Es erstellt keine Variablen, die wir nur für den Zweck der Iteration benötigen.
  • Es erstellt einen Sichtbarkeitsbereich für die lokalen Variablen der Schleife.
  • Es steigert die Leistung.

Gibt es einen Grund, warum gibt es keine object.forEachfor(var key in object) zu ersetzen?

Natürlich könnten wir eine JavaScript-Implementierung wie _.each oder $ .each verwenden, aber das sind Performance-Killer.

+1

Diese Frage eignet sich besser für Personen, die an den Diskussionen von ES5/ES6 beteiligt sind. – alex

+0

Warum muss "for-in" ersetzt werden? Und warum sollte ein "Object.forEach" nicht auch ein Performance-Killer sein? Der Treffer kommt hauptsächlich vom Aufruf der Callback-Funktion. –

Antwort

62

Nun, es ist ziemlich einfach, sich selbst zu riggen. Warum sollten die Prototypen weiter verschmutzt werden?

Object.keys(obj).forEach(function(key) { 
    var value = obj[key]; 
}); 

Ich denke, ein wichtiger Grund ist, dass die Kräfte, die in ihren Eigenschaften zu Object zu vermeiden Hinzufügen gebaut wollen werden. Object s sind die Bausteine ​​von allem in Javascript, sind aber auch der generische Schlüssel/Wert-Speicher in der Sprache. Das Hinzufügen neuer Eigenschaften zu Object würde zu einem Konflikt mit Eigenschaftsnamen führen, die Ihr Javascript-Programm möglicherweise verwenden möchte. Das Hinzufügen von eingebauten Namen zu Object erfolgt daher mit äußerster Vorsicht.

Array wird durch Ganzzahlen indiziert, so dass dieses Problem nicht auftritt.

Deshalb haben wir auch Object.keys(obj) anstelle von einfach obj.keys. Verunreinigen Sie den Object-Konstruktor so, dass es normalerweise keine große Sache ist, aber lassen Sie die Instanzen in Ruhe.

+18

Aber 'Object.forEach' (nicht im Prototyp) wäre nett. – kirilloid

+5

Es würde, stimme ich zu :) –

+1

Es ist nicht IMHO. Es heißt Konsistenz. Andere Sprachen haben es, JS ist eines der schlechtesten auf diesem Brett. Ähnliche Aktionen und Transformationen, die für unterschiedliche Arten von Typen ausgeführt werden, funktionieren logisch unterschiedlich und haben eine völlig unterschiedliche Syntax. Eines der größten Bullshits musst du essen, wenn du in Kopf organisiert bist, JS wird dich umdrehen – DanteTheSmith

2

Sie müssen daran denken, dass jedes Objekt in JavaScript von Object erbt. Nicht jedes Objekt in JavaScript muss die Eigenschaften iteriert haben. Diese sind meist auf Datenmodellobjekte beschränkt. Durch Hinzufügen der forEach-Methode wird der Prototyp jedes-Objekts nur unnötig vergrößert.

Wenn Sie derzeit das Objekt und seine Methoden sehen, sind diese nur vorhanden, um das Objekt zu identifizieren oder um ein Objekt von einem anderen zu unterscheiden.

5
  1. .forEachnicht Variablen erstellen nur zum Zwecke der Iteration ... Nur eben nicht diejenigen, die Sie erstellen, selbst.
    Wenn Sie ein Shim verwenden, handelt es sich um JS-Variablen in einer Closure, andernfalls wahrscheinlich in C++ oder der nativen Implementierung des Browsers.

  2. ES6 erhält for ... of, die durchlaufen, was auch immer Sie es übergeben.

  3. ES6 wird auch Block-Level-Variablen bekommen (und nicht funktions scoped), let, daß anstelle von var

  4. Sie der Lage sein werden Iteratoren auf bestimmte Arten von Objekten in ES6 (dh hinzuzufügen: die Objekte, die Sie erstellen, um Iteratoren zu unterstützen).

Aber das Problem dabei ist, dass ES5 gemeint war der größte Teil der Syntax von ES3 (einige neue Keywords und keine neuen Keywords in regelmäßigen-use) zu bewahren.
Die meisten zusätzlichen Funktionen mussten Methodenaufrufe sein (normalerweise prototyped).
Und Arrays brauchten viel Arbeit, wenn man bedenkt, wie viel mehr JS seit ES3 gestartet wurde.

Objekte benötigen keine .map()/.reduce() Fähigkeit, es sei denn, Sie erstellen sehr spezielle Objekte, in diesem Fall implementieren Sie diese selbst.