Dlaczego w ECMAScript 5 nie ma metody forEach na obiekcie?

ECMAScript 5 ' s array.forEach(callback[, thisArg]) jest bardzo wygodny do iteracji na tablicy i ma wiele zalet nad składnią z for:

    Jest bardziej zwięzły.
  • nie tworzy zmiennych, których potrzebujemy tylko w celu iteracji.
  • tworzy zakres widoczności dla lokalnych zmiennych pętli.
  • To zwiększa wydajność.

Czy Jest jakiś powód, dla którego nie ma object.forEach do zastąpienia for(var key in object) ?

Oczywiście, możemy użyć JavaScript realizacja, jak _.każdy lub $.każdy z nich jest zabójcą wydajności.

Author: Samuel Rossille, 2013-02-18

3 answers

Cóż, całkiem łatwo się pozbierać. Dlaczego dalej zanieczyszczają prototypy?

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

Myślę, że dużym powodem jest to, że uprawnienia, które be chcą uniknąć dodawania wbudowanych właściwości do Object. Objects są elementami składowymi wszystkiego w Javascript, ale są również ogólnym przechowywaniem klucza/wartości w języku. Dodanie nowych właściwości do Object byłoby sprzeczne z nazwami właściwości, których program Javascript może chcieć użyć. Więc dodawanie wbudowanych nazw do Object odbywa się za pomocą extreme Uwaga.

Tablica jest indeksowana przez liczby całkowite, więc nie ma tego problemu.

Dlatego też mamy Object.keys(obj) zamiast po prostu obj.keys. Zanieczyszczaj konstruktor Object, ponieważ zazwyczaj nie jest to wielka sprawa, ale zostaw instancje w spokoju.

 69
Author: Alex Wayne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-19 03:00:30
  1. .forEach czy tworzy zmienne tylko w celu iteracji... Tylko nie te, które sam tworzysz.
    Jeśli używasz shim, to są to zmienne JS w zamknięciu, w przeciwnym razie są prawdopodobnie w C++ lub czymkolwiek jest natywna implementacja przeglądarki.

  2. ES6 dostaje for ... of, który będzie powtarzał przez cokolwiek go przejdziesz.

  3. ES6 otrzymuje również zmienne na poziomie bloków (zamiast funkcji), używając let, zamiast var

  4. W ES6 będzie można dodawać Iteratory do określonych typów obiektów (np. obiektów budowanych do obsługi iteratorów).

Ale problem polega na tym, że ES5 miał zachować większość składni ES3 (kilka nowych słów kluczowych i brak nowych słów kluczowych w regularnym użyciu).
Większość dodatkowych funkcji musiały być wywołania metod (zazwyczaj prototypowe).
A tablice wymagały dużo pracy, biorąc pod uwagę jak dużo więcej js widział od ES3 / align = "left" /

Obiekty nie potrzebują .map() / .reduce() zdolności, chyba że budujesz bardzo konkretne obiekty, w takim przypadku sam je realizujesz.

 6
Author: Norguard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-18 05:28:14

Należy pamiętać, że każdy obiekt w javascript dziedziczy z Object. Nie każdy obiekt w javascript musi mieć iterację jego właściwości. Są one w większości ograniczone do obiektów modelu danych. Dodanie metody forEach niepotrzebnie zwiększy prototyp KAŻDEGO obiektu.

Jeśli obecnie widzisz obiekt i jego metody, są one obecne tylko w celu identyfikacji obiektu lub odróżnienia jednego obiektu od drugiego.

 2
Author: Varun Achar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-18 05:21:27