Почему нет метода forEach для объекта в ECMAScript 5?
ECMAScript 5 array.forEach(callback[, thisArg])
очень удобен для итерации по массиву и имеет много преимуществ перед синтаксисом: a:
- Это более кратким.
- Он не создает переменные, которые нам нужны только для целей итерации.
- Он создает видимость для локальных переменных цикла.
- Это повышает производительность.
Есть ли причина, по которой нет object.forEach
для замены for(var key in object)
?
Конечно, мы могли бы использовать реализацию JavaScript, такую как _.each или $.each, но это убийцы производительности.
Ответы
Ответ 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 будет только излишне перенастраивать прототип каждого объекта.
Если вы в настоящее время видите Объект и его методы, они присутствуют только для идентификации объекта или для выделения одного объекта из другого.