Я знаю, что такое for... in
цикл (он повторяется по ключу), но слышал в первый раз for... of
(он повторяет по значению).
Я запутался с for... of
петлей. Я не получил adject. Это код ниже:
var arr = [3, 5, 7];
arr.foo = "hello";
for (var i in arr) {
console.log(i); // logs "0", "1", "2", "foo"
}
for (var i of arr) {
console.log(i); // logs "3", "5", "7"
// it is does not log "3", "5", "7", "hello"
}
То, что я получил, for... of
перебирает значения свойств. Тогда почему он не регистрируется (возвращается) "3", "5", "7", "hello"
вместо "3", "5", "7"
? но for... in
цикл повторяется по каждому ключу ( "0", "1", "2", "foo"
). Здесь for... in
цикл также перебирает foo
ключ. Но for... of
не итерация по стоимости foo
имущества , т.е. "hello"
. Почему это так?
Короче говоря:
Здесь я утешаю for... of
петлю. Это должно войти, "3", "5", "7","hello"
но здесь это входит "3", "5", "7"
. Почему ?
javascript
arrays
object
Мукунд Кумар
источник
источник
for ... of
был переведен на язык, чтобы решить проблемы с использованиемfor ... in
массивов.Array.prototype
могут быть изменены таким образом, чтобы были доступны дополнительные свойства, что делает небезопасным их повторение, поскольку вы можете получить нечисловые ключи, которые вы не ожидали.of
слова JavaScript (для ... циклов) , поскольку он спрашивает о конкретном поведении функции, а не запрашивает общий обзор.for <key> in
for <value> of
for..of
Ответы:
for in
перебирает перечисляемые имена свойств объекта.for of
(новинка в ES6) использует специфичный для объекта итератор и перебирает значения, сгенерированные этим.В вашем примере итератор массива выдает все значения в массиве (игнорируя неиндексные свойства).
источник
for ... of
стандартизирован в ES6.for... of
:: arrays :: массивы всегда имеют длину, так что вы можете думатьfor..
[n-й элемент]of..
[q-элементов]for..in..keys
=== внешние ключи === использоватьfor...in
для ключей! Таким образом, используйтеfor...of
для ценностей.Я нахожу полный ответ по адресу: https://www.typescriptlang.org/docs/handbook/iterators-and-generators.html (хотя это и для сценария типа, то же самое относится и к javascript)
источник
index
. И тогда для "из" будетvalues
каждого индекса / ключа / элемента.let thisItem = items[all];
переменные, этоfor...of
помогает быстро!for...in
какObject.keys()
, угадайте, что? Массивы - это объекты, которые также возвращают свои значения. :)Для ... в цикле
Цикл for ... in устраняет недостатки цикла for, устраняя логику счета и условие выхода.
Пример:
Но вам все еще приходится иметь дело с проблемой использования индекса для доступа к значениям массива, и это воняет; это почти делает его более запутанным, чем раньше.
Кроме того, цикл for ... in может доставить вам большие неприятности, когда вам нужно добавить дополнительный метод в массив (или другой объект). Поскольку цикл for ... in перебирает все перечисляемые свойства, это означает, что если вы добавите какие-либо дополнительные свойства в прототип массива, то эти свойства также появятся в цикле.
Печать:
Вот почему для циклов for ... in не рекомендуется использовать циклы над массивами.
Для ... петли
Цикл for ... of используется для циклического повторения любого типа данных.
Пример:
Печать:
Это делает цикл for ... of наиболее кратким вариантом всех циклов for.
Но подождите, это еще не все! Цикл for ... of также имеет некоторые дополнительные преимущества, которые устраняют недостатки циклов for и for ... in.
Вы можете остановить или прервать цикл ... в любое время.
Печать:
И вам не нужно беспокоиться о добавлении новых свойств к объектам. Цикл for ... of будет зацикливать только значения в объекте.
источник
for (var index=0; index<arr.length; index++)
цикл (вindex
отличие от вашего примера счетчик является целым числом).Разница
for..in
иfor..of
:И то,
for..in
и другоеfor..of
- циклические конструкции, которые используются для перебора структур данных. Разница лишь в том, что они повторяют:for..in
перебирает все перечисляемые ключи свойств объектаfor..of
перебирает значения повторяемого объекта. Примерами итерируемых объектов являются массивы, строки и списки узлов.Пример:
В этом примере мы можем наблюдать, как
for..in
цикл перебирает ключи объекта, который в этом примере является объектом массива. Ключи 0, 1, 2 соответствуют элементам массива, которые мы добавили, иaddedProp
. Вот какarr
выглядит объект массива в chrome devtools:Вы видите, что наш
for..in
цикл не делает ничего, кроме простой итерации по этим значениям.for..of
Петля в нашем примере перебирает значения структуры данных. Значения в этом конкретном примере'el1', 'el2', 'el3'
. Значения, которые будет возвращать итеративная структура данных,for..of
зависят от типа итерируемого объекта. Например, массив будет возвращать значения всех элементов массива, тогда как строка возвращает каждый отдельный символ строки.источник
Оператор
for...in
перебирает перечисляемые свойства объекта в произвольном порядке. Перечислимыми свойствами являются те свойства, для которых внутренний флаг [[Enumerable]] установлен в значение true, поэтому, если в цепочке прототипов есть какое-либо перечислимое свойство,for...in
цикл будет итерироваться и по ним.Оператор
for...of
перебирает данные, которые итерируемый объект определяет для перебора.Пример:
Как и раньше, вы можете пропустить добавление
hasOwnProperty
вfor...of
циклы.источник
Оператор for-in перебирает перечисляемые свойства объекта в произвольном порядке.
Цикл будет перебирать все перечисляемые свойства самого объекта и тех, которые объект наследует от прототипа своего конструктора
Вы можете думать об этом как о «в» итерации и перечислять все ключи.
источник
for in
будет показывать только ключи , если они будут добавлены нами, он не собирается показать formatUnicornString.prototype
.Есть некоторые уже определенные типы данных, которые позволяют легко их перебирать, например, Array, Map, String Objects
Обычный для in выполняет итерации по итератору и в ответ предоставляет нам ключи в порядке вставки, как показано в примере ниже.
Теперь, если мы попробуем то же самое с for , то в ответ он предоставит нам значения, а не ключи. например
Поэтому, глядя на оба итератора, мы можем легко различить разницу между ними.
Так что, если мы попытаемся перебрать обычный объект, он выдаст нам ошибку, например:
Теперь для итерации нам нужно определить ES6 Symbol.iterator, например:
В этом разница между For in и For of . Надеюсь, что это может очистить разницу.
источник
Еще одно различие между двумя циклами, о котором никто не упоминал ранее:
Источник
Поэтому, если мы хотим использовать деструктуризацию в цикле, для получения как индекса, так и значения каждого элемента массива , мы должны использовать
for...of
цикл с методом Arrayentries()
:источник
for each...in
это устарело (первый пункт), но я не писал об этом ... Я написал, что "Уничтожениеfor...in
устарело. Используйтеfor...of
вместо этого". (второй момент): developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Согласны ли вы со мной @GalMargalit?Все объяснили, почему возникает эта проблема, но все еще очень легко забыть об этом, а затем почесать голову, почему вы получили неправильные результаты. Особенно, когда вы работаете с большими наборами данных, когда результаты на первый взгляд кажутся хорошими.
Используя
Object.entries
вы убедитесь, чтобы пройти через все свойства:источник
Я вижу много хороших ответов, но я решил поставить свои 5 центов, чтобы иметь хороший пример:
Для в петле
перебирает все перечисляемые реквизиты
Для петли
перебирает все повторяемые значения
источник
Когда я впервые начал изучать цикл for in and of loop , меня тоже смутили мои результаты, но после нескольких исследований и понимания вы можете думать об отдельном цикле следующим образом:
let profile = { name : "Naphtali", age : 24, favCar : "Mustang", favDrink : "Baileys" }
Приведенный выше код просто создает объект с именем profile , мы будем использовать его в обоих наших примерах , поэтому не смущайтесь, когда вы видите объект профиля в примере, просто знайте, что он был создан.
for ... of loop * может возвращать либо свойство , значение, либо оба , давайте посмотрим, как это сделать. В javaScript мы не можем циклически проходить через объекты, как если бы мы работали с массивами, поэтому есть несколько элементов, которые мы можем использовать для доступа к любому из наших выборов из объекта.
Object.keys ( object-name-go-here ) >>> Возвращает ключи или свойства объекта.
Object.values ( object-name-go-here ) >>> Возвращает значения объекта.
Ниже приведены примеры их использования, обратите внимание на Object.entries () :
источник
for-in
циклfor-in
Цикл используется для перемещения по перечисляемым свойствам коллекции в произвольном порядке . Коллекция - это объект типа контейнера, элементы которого могут использовать индекс или ключ.for-in
Цикл извлекает перечисляемые свойства ( ключи ) коллекции сразу и выполняет итерацию по одному за раз. Перечисляемое свойство - это свойство коллекции, которое может появляться вfor-in
цикле.По умолчанию все свойства массива и объекта отображаются в
for-in
цикле. Однако мы можем использовать метод Object.defineProperty для ручной настройки свойств коллекции.В приведенном выше примере, свойство
d
изmyObject
и индекс3
изmyArray
не появляется вfor-in
цикле , потому что они настроены сenumerable: false
.Есть несколько проблем с
for-in
петлями. В случае массивов,for-in
цикл также будет учитыватьmethods
добавление в массив с использованиемmyArray.someMethod = f
синтаксиса, однакоmyArray.length
остается4
.for-of
циклЭто ошибочное мнение, что
for-of
цикл повторяется над значениями коллекции.for-of
цикл перебираетIterable
объект. Итерируемый - это объект, у которого есть метод с именем,Symbol.iterator
прямо на нем, на одном из его прототипов.Symbol.iterator
Метод должен возвращать Итератор . Итератор - это объект, у которого естьnext
метод. Этот метод при вызове returnvalue
иdone
properties.Когда мы итерируем итеративный объект, используя
for-of
цикл,Symbol.iterator
метод будет вызван после получения объекта итератора . Для каждой итерацииfor-of
циклаnext
метод этого объекта итератора будет вызываться до тех пор, покаdone
в результатеnext()
вызова не будет возвращено значение false. Значение, полученноеfor-of
циклом для каждой итерации, еслиvalue
свойство возвращается приnext()
вызове.for-of
Цикл нового в ES6 и так является Iterable и итерируемый . ТипArray
конструктора имеетSymbol.iterator
метод на своем прототипе.Object
Конструктор , к сожалению , не имеет его , ноObject.keys()
,Object.values()
иObject.entries()
методы возвращают итератор ( вы можете использовать ,console.dir(obj)
чтобы проверить методы прототипа ). Преимуществоfor-of
цикла в том, что любой объект может быть сделан итеративным, даже ваш пользовательскийDog
иAnimal
классы.Самый простой способ сделать объект итеративным - это использовать ES6 Generator вместо пользовательской реализации итератора.
В отличие от цикла
for-in
,for-of
цикл может ожидать завершения асинхронной задачи в каждой итерации. Это достигается с помощьюawait
ключевого слова послеfor
выписки документации .Еще одна замечательная особенность
for-of
цикла заключается в том, что он поддерживает Unicode. Согласно спецификации ES6 строки хранятся в кодировке UTF-16. Таким образом, каждый символ может принимать либо16-bit
или32-bit
. Традиционно строки хранились в кодировке UCS-2, которая поддерживает символы, которые могут храниться16 bits
только внутри .Следовательно,
String.length
возвращает количество16-bit
блоков в строке. Современные персонажи, такие как Emoji, занимают 32 бита. Следовательно, этот символ возвращаетlength
2.for-in
цикл повторяется по16-bit
блокам и возвращает неправильное значениеindex
. Тем не менее,for-of
цикл перебирает отдельные символы на основе спецификаций UTF-16.источник
Я нашел следующее объяснение из https://javascript.info/array очень полезным:
Один из самых старых способов циклического перемещения элементов массива - это цикл по индексам:
Технически, поскольку массивы являются объектами, их также можно использовать для ... в:
Цикл for..in перебирает все свойства, не только числовые.
В браузере и в других средах есть так называемые «подобные массиву» объекты, которые выглядят как массивы. То есть они имеют свойства длины и индексов, но они также могут иметь другие нечисловые свойства и методы, которые нам обычно не нужны. Цикл for..in перечислит их все же. Поэтому, если нам нужно работать с объектами, похожими на массивы, то эти «дополнительные» свойства могут стать проблемой.
Цикл for..in оптимизирован для общих объектов, а не массивов, и, следовательно, в 10-100 раз медленнее. Конечно, это все еще очень быстро. Ускорение может иметь значение только в узких местах. Но все же мы должны осознавать разницу.
Как правило, мы не должны использовать for ..in для массивов.
источник
Вот полезная мнемоника для запоминания различий между
for...in
Loop иfor...of
Loop."Индекс, объект"
for...in Loop
=> перебирает индекс в массиве.for...of Loop
=> перебирает объект объектов.источник