(Обновление: в моем другом ответе здесь изложены параметры, не относящиеся к 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
; подробности см. В ответе, указанном выше ).
Преимущества : Декларативная, может использовать предварительно созданную функцию для итератора, если у вас есть один удобный способ, если ваше тело цикла сложное, иногда полезна область видимости вызова функции, нет необходимости в 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
означает что-то еще внутри функции.
Вы можете избежать этого 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
может быть вполне разумным способом избежать множества ненужных циклов, так как будут перечислены только заполненные индексы.
.each()
илиfor...in
для циклического перебора массива вообще плохая идея. Это как возрасты медленнее, чем использованиеfor
илиwhile
. Используяfor loop
это даже отличная идея для кэшированияlength
свойства перед циклом.for (var i = 0, len = substr.length; i < len; ...
Function#bind
. :-) Хороший вопрос, добавил.i++
и++i
является результатом этого выражения, которое никогда не используется в приведенном выше примере.for
Цикл работает следующим образом: 1. Инициализация, 2. Тест (прекращается , если ложь), 3. Тело, 4. Обновление, 5. Возврат к шагу 2. Результат выражения обновления не используется ни для чего.jQuery.each ()
jQuery.each ()
итерация массива
итерация объекта
пример :
циклы JavaScript для массива
для цикла
пример
для в
для из
для каждого
Ресурсы
Циклы MDN и итераторы
источник
Здесь нет необходимости в jquery, просто работает
for
цикл:источник
Вариант 1: традиционная
for
петляОсновы
Традиционный
for
-loop имеет три компонента:Эти три компонента отделены друг от друга
;
символом. Содержимое для каждого из этих трех компонентов является необязательным, что означает, что следующее является самым минимальнымfor
возможным циклом:Конечно, вам нужно будет включить
if(condition === true) { break; }
илиif(condition === true) { return; }
где-то внутри этогоfor
-loop, чтобы заставить его перестать работать.Обычно, однако, инициализация используется для объявления индекса, условие используется для сравнения этого индекса с минимальным или максимальным значением, а запоздалая мысль используется для увеличения индекса:
Использование tradtional
for
-loop для обхода массиваТрадиционный способ перебрать массив, это:
Или, если вы предпочитаете цикл в обратном направлении, вы делаете это:
Однако возможны многие варианты, например, например. вот этот :
... или этот ...
... или этот:
То, что работает лучше всего, в значительной степени зависит как от личного вкуса, так и от конкретного варианта использования, который вы реализуете.
Примечание :Каждый из этих вариантов поддерживается всеми браузерами, включая самые старые!
Вариант 2:
while
-петлОдной альтернативой
Примечание :for
-loop являетсяwhile
-loop. Чтобы перебрать массив, вы можете сделать это:Как и традиционные
for
-loops,while
-loops поддерживаются даже в самых старых браузерах.Кроме того, каждый цикл while может быть переписан как
for
-loop. Например,while
-loop здесь ведет себя точно так же, как этотfor
-loop:Вариант 3:
for...in
иfor...of
В JavaScript вы также можете сделать это:
Однако это следует использовать с осторожностью, поскольку
for
во всех случаях он ведет себя не так, как традиционная петля, и существуют потенциальные побочные эффекты, которые необходимо учитывать. См. Почему использование «for ... in» с итерацией массива - плохая идея? Больше подробностей.Как альтернатива
Примечание :for...in
, теперь есть и дляfor...of
. В следующем примере показана разница междуfor...of
циклом иfor...in
циклом:Вы также должны учитывать, что ни одна версия Internet Explorer не поддерживает
for...of
( Edge 12+ ) иfor...in
требует как минимум IE10.Вариант 4:
Array.prototype.forEach()
Альтернативой
Примечание :For
-loops являетсяArray.prototype.forEach()
следующий синтаксис:Array.prototype.forEach()
поддерживается всеми современными браузерами, а также IE9 +.Вариант 5:
jQuery.each()
В дополнение к четырем другим упомянутым опциям, у jQuery также была своя
foreach
вариация.Он использует следующий синтаксис:
источник
Используйте
each()
функцию jQuery.Вот пример:
источник
Используйте jQuery
each()
. Есть и другие способы, но каждый предназначен для этой цели.И не ставьте запятую после последнего номера.
источник
Синтаксис ES6 с функцией стрелки и интерполяцией:
источник
Вы можете использовать
for()
цикл:источник
Попробуй это:
источник
Альтернативные способы итерации по массиву / строке с побочными эффектами
источник