Подтвердить что ты не робот

Почему нет метода forEach для объекта в ECMAScript 5?

ECMAScript 5 array.forEach(callback[, thisArg]) очень удобен для итерации по массиву и имеет много преимуществ перед синтаксисом: a:

  • Это более кратким.
  • Он не создает переменные, которые нам нужны только для целей итерации.
  • Он создает видимость для локальных переменных цикла.
  • Это повышает производительность.

Есть ли причина, по которой нет object.forEach для замены for(var key in object)?

Конечно, мы могли бы использовать реализацию JavaScript, такую ​​как _.each или $.each, но это убийцы производительности.

4b9b3361

Ответ 1

Ну, довольно легко подстроить себя. Зачем еще загрязнять прототипы?

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

Я думаю, что большая причина в том, что полномочия, которые хотят избежать добавления встроенных свойств в Object. Object являются строительными блоками всего в Javascript, но также являются общим хранилищем ключей/значений на языке. Добавление новых свойств в Object будет противоречить именам свойств, которые может использовать ваша программа Javascript. Поэтому добавление встроенных имен в Object выполняется с особой осторожностью.

Массив индексируется целыми числами, поэтому он не имеет этой проблемы.

Вот почему мы имеем Object.keys(obj) вместо просто obj.keys. Заглушите конструктор Object, поскольку он обычно не имеет большого значения, но оставляйте экземпляры отдельно.

Ответ 2

  • .forEach создает переменные только для целей итерации... Только не те, которые вы создаете сами.
    Если вы используете прокладку, то они являются переменными JS в закрытии, иначе они, скорее всего, на С++ или независимо от исходной реализации браузера.

  • ES6 получает for ... of, который будет проходить через все, что вы передадите.

  • ES6 также получает переменные уровня блока (а не функции), используя let вместо var

  • Вы сможете добавлять итераторы к определенным типам объектов в ES6 (т.е. объекты, которые вы создаете для поддержки итераторов).

Но проблема здесь в том, что ES5 должен был сохранить большую часть синтаксиса ES3 (несколько новых ключевых слов и новых ключевых слов в регулярном использовании).
Большая часть дополнительной функциональности должна была быть вызовом метода (прототип, как правило).
И массивы нуждались в большом количестве работы, учитывая, насколько больше JS видели с момента запуска ES3.

Объектам не требуется способность .map()/.reduce(), если вы не создаете ОЧЕНЬ СПЕЦИФИЧЕСКИЕ объекты, и в этом случае вы их реализуете самостоятельно.

Ответ 3

Вы должны помнить, что каждый объект в javascript наследуется от Object. Не каждый объект в javascript должен иметь свойства iterated. Они в основном ограничены объектами модели данных. Добавление метода forEach будет только излишне перенастраивать прототип каждого объекта.

Если вы в настоящее время видите Объект и его методы, они присутствуют только для идентификации объекта или для выделения одного объекта из другого.