web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas de méthode forEach sur Object dans ECMAScript 5?

array.forEach(callback[, thisArg]) d'ECMAScript 5 est très pratique pour itérer sur un tableau et présente de nombreux avantages par rapport à la syntaxe avec un for:

  • C'est plus concis.
  • Il ne crée pas de variables dont nous avons besoin uniquement dans le but d'itérer.
  • Cela crée une portée de visibilité pour les variables locales de la boucle.
  • Il augmente les performances.

Y a-t-il une raison pour laquelle il n'y a pas de object.forEach Pour remplacer for(var key in object)?

Bien sûr, nous pourrions utiliser une implémentation JavaScript, comme _.each ou $ .each, mais ce sont des tueurs de performances.

37
Samuel Rossille

Eh bien, il est assez facile de se mettre en place. Pourquoi polluer davantage les prototypes?

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

Je pense qu'une grande raison est que les pouvoirs en place veulent éviter d'ajouter des propriétés intégrées à Object. Objects sont les blocs de construction de tout en Javascript, mais sont également le magasin générique de clé/valeur dans la langue. L'ajout de nouvelles propriétés à Object entrerait en conflit avec les noms de propriété que votre programme Javascript pourrait vouloir utiliser. L'ajout de noms intégrés à Object se fait donc avec une extrême prudence.

Le tableau est indexé par des entiers, il n'a donc pas ce problème.

C'est aussi pourquoi nous avons Object.keys(obj) au lieu de simplement obj.keys. Pollue le constructeur Object car ce n'est généralement pas un gros problème, mais laissez les instances tranquilles.

76
Alex Wayne
  1. .forEachne crée des variables juste à des fins d'itération ... Juste pas celles que vous créez vous-même.
    Si vous utilisez un shim, alors ce sont des variables JS dans une fermeture, sinon elles sont probablement en C++, ou quelle que soit l'implémentation native du navigateur.

  2. ES6 obtient for ... of Qui itérera à travers tout ce que vous passerez.

  3. ES6 obtient également des variables de niveau bloc (plutôt que de portée de fonction), en utilisant let, au lieu de var

  4. Vous pourrez ajouter des itérateurs à des types spécifiques d'objets dans ES6 (c'est-à-dire les objets que vous construisez pour prendre en charge les itérateurs).

Mais le problème ici est que ES5 était censé préserver la majeure partie de la syntaxe d'ES3 (quelques nouveaux mots clés et aucun nouveau mot clé en utilisation régulière).
La plupart des fonctionnalités supplémentaires devaient être des appels de méthode (prototypés, généralement).
Et les baies nécessitaient beaucoup de travail, compte tenu de l'utilisation accrue que JS a vu depuis le lancement d'ES3.

Les objets n'ont pas besoin d'une capacité .map()/.reduce(), sauf si vous construisez des objets TRÈS SPÉCIFIQUES, auquel cas vous les implémentez vous-même.

6
Norguard

Vous devez vous rappeler que chaque objet en javascript hérite de Object. Tous les objets en javascript n'ont pas besoin d'avoir leurs propriétés itérées. Ceux-ci sont principalement limités aux objets du modèle de données. L'ajout de la méthode forEach ne fera que grossir inutilement le prototype de l'objet every.

Si vous voyez actuellement l'objet et ses méthodes, ils ne sont présents que pour identifier l'objet ou pour distinguer un objet d'un autre.

2
Varun Achar