(Обновление: Мой другой ответ здесь гораздо точнее излагает опции не-jQuery. Третий вариант ниже, jQuery.each
, в нем, однако, отсутствует.)
Четыре варианта:
Общий цикл:
var i;
for (i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
или в ES2015 +:
for (let i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
Преимущества : прямойвперед, нет зависимости от jQuery, легко понять, нет проблем с сохранением значения this
в теле цикла, нет ненужных накладных расходов на вызовы функций (например, в теории быстрее, хотя на самом делеу вас должно быть так много элементов, что, скорее всего, у вас будут другие проблемы; детали ).
ES5 forEach
:
Начиная с ECMAScript5,массивы имеют forEach
функцию, которая упрощает цикл по массиву:
substr.forEach(function(item) {
// do something with `item`
});
Ссылка на документы
(Примечание: таммножество других функций, а не только forEach
; подробности см. в ответе, указанном выше .)
Преимущества : Declarative, может использовать предварительно скомпилированную функцию для итератора, если у вас есть одна удобная вещь, если ваше тело цикла сложное, иногда полезна область видимости вызова функции, нет необходимости в переменной i
в вашей содержащей области.
Недостатки : Если вы используете this
в содержащем коде и хотите использовать this
в вашем forEach
обратном вызове, вы должны либо A) Вставить его в переменную, чтобы вы моглииспользуйте его в функции, B) передайте его в качестве второго аргумента forEach
, поэтому forEach
устанавливает его как this
во время обратного вызова, или C) используйте ES2015 + функцию стрелки , которая закрываетсяthis
.Если вы не сделаете одну из этих вещей, в обратном вызове this
будет undefined
(в строгом режиме) или глобальный объект (window
) в свободном режиме.Раньше был второй недостаток, заключающийся в том, что forEach
не был универсально поддержан, но здесь, в 2018 году, единственный браузер, с которым вы собираетесь работать, не имеющий forEach
, это IE8 (и это не может быть правильно также заполняется там.)
ES2015 + for-of
:
for (const s of substr) { // Or `let` if you want to modify it in the loop body
// do something with `s`
}
См. Ответ в верхней части этого ответа для получения подробной информации о том, как это работает.
Преимущества : Простой, простой, предлагает переменную автономного объема (или константу, как указано выше) для записи из массива.
Недостатки : Не поддерживается ни в одной версии IE.
jQuery.each:
jQuery.each(substr, function(index, item) {
// do something with `item` (or `this` is also `item` if you like)
});
( Ссылка на документы )
Преимущества: Все те же преимущества, что и forEach
, плюс вы знаете, что он есть, поскольку вы используете jQuery.
Недостатки : Если вы используете this
всодержащий код, вы должны вставить его в переменную, чтобы использовать его внутри функции, так как this
означает что-то еще внутри функцииtion.
Вы можете избежать вещи this
, используя $.proxy
:
jQuery.each(substr, $.proxy(function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}, this));
... или Function#bind
:
jQuery.each(substr, function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}.bind(this));
... или в ES2015 ("ES6"), функция стрелки:
jQuery.each(substr, (index, item) => {
// do something with `item` (`this` is the same as it was outside)
});
Что НЕ делать:
Не используйте for..in
для этого (или, если вы делаете, сделайте это с надлежащими мерами предосторожности).Вы увидите, что люди говорят (на самом деле, здесь кратко был ответ, говорящий об этом), но for..in
не делает то, что думают многие, (делает что-то еще более полезное!).В частности, for..in
перебирает перечисляемые имена свойств объекта (не индексы массива).Поскольку массивы являются объектами, а их единственными перечисляемыми свойствами по умолчанию являются индексами, в основном, кажется, что-то вроде работы в обычном развертывании.Но это не безопасное предположение, что вы можете просто использовать его для этого.Вот исследование: http://jsbin.com/exohi/3
Я должен смягчить "не" выше.Если вы имеете дело с разреженными массивами (например, в массиве всего 15 элементов, но их индексы по какой-то причине разбросаны по диапазону от 0 до 150 000, и поэтому length
равно 150 001), и если вы используете соответствующие меры безопасности, такие как hasOwnProperty
, и проверяете, что имя свойства действительно числовое (см. ссылку выше), for..in
может быть вполне разумным способом избежать множества ненужных циклов, поскольку будут перечисляться только заполненные индексы.