Как вы думаете, есть большая разница в циклах for ... in и for? Какое «для» вы предпочитаете использовать и почему?
Допустим, у нас есть массив ассоциативных массивов:
var myArray = [{'key': 'value'}, {'key': 'value1'}];
Итак, мы можем повторить:
for (var i = 0; i < myArray.length; i++)
А также:
for (var i in myArray)
Я не вижу большой разницы. Есть ли проблемы с производительностью?
javascript
андрей
источник
источник
myArray.forEach(callback[, thisarg])
.if(myArray.hasOwnProperty(i)){true}
['foo', 'bar', 'baz'].forEach(function(element, index, array){ console.log(element, index, array); });
можно использовать практически везде, кроме IE8 - и это, безусловно, самый элегантный синтаксисfor...of
заявление в ECMAScript 6 , например:for (let i of myArray) console.log(i);
Ответы:
Выбор должен быть основан на том, какая идиома лучше всего понимается.
Массив повторяется с использованием:
Объект, используемый в качестве ассоциативного массива, повторяется с использованием:
Если у вас нет причин разрушать землю, придерживайтесь установленной схемы использования.
источник
for
, а не оценивать a.length каждый раз в цикле.i < l
, что нетi < a
, в твоем состоянии цикла.Дуглас Крокфорд рекомендует в JavaScript: Хорошие детали (стр. 24) избегать использования этого
for in
утверждения.Если вы используете
for in
для циклического перебора имен свойств в объекте, результаты не упорядочены. Хуже: вы можете получить неожиданные результаты; в него входят члены, унаследованные от цепочки прототипов, и имена методов.Все, кроме свойств, может быть отфильтровано
.hasOwnProperty
. Этот пример кода делает то, что вы, вероятно, хотели изначально:источник
name
переменной:for(var name in object)...
, в противном случае, если этот код находится внутри функции, например, тоname
переменная в конечном итоге свойство глобального объекта (присваивание необъявленной идентификатора делает это), а также в новом ECMAScript 5 Строгий режим, этот код будет выбрасыватьReferenceError
.FYI - jQuery пользователи
each(callback)
Метод jQueryfor( ; ; )
по умолчанию использует цикл и будет использоватьfor( in )
только если длина равнаundefined
.Поэтому я бы сказал, что при использовании этой функции безопасно принять правильный порядок.
Пример :
Недостатком использования этого является то, что если вы выполняете какую-то логику, не связанную с пользовательским интерфейсом, ваши функции будут менее переносимы к другим средам. Эта
each()
функция, вероятно, лучше всего зарезервирована для использования с селекторами jQuery иfor( ; ; )
может быть рекомендована в противном случае.источник
Существуют различия в производительности в зависимости от того, какой цикл вы используете и в каком браузере.
Например:
почти в два раза быстрее в некоторых браузерах, чем:
Однако, если ваши массивы ОГРОМНЫ или вы не зацикливаете их постоянно, все достаточно быстро. Я серьезно сомневаюсь, что зацикливание массивов является узким местом в вашем проекте (или для любого другого проекта в этом отношении)
источник
for(var i = myArray.length; i--;)
Обратите внимание, что родной метод Array.forEach теперь широко поддерживается .
источник
Обновленный ответ за 2012 год текущей версии всех основных браузеров - Chrome, Firefox, IE9, Safari и Opera поддерживают встроенный в ES5 массив .forEach.
Если у вас нет причин поддерживать нативную поддержку IE8 (имея в виду, что этим пользователям могут быть предоставлены рамки ES5-shim или Chrome, что обеспечит надлежащую среду JS), проще использовать правильный синтаксис языка:
Полная документация для array.forEach () находится в MDN.
источник
Два не совпадают, когда массив разреженный.
источник
Использование forEach для пропуска цепочки прототипов
Просто быстрое дополнение к ответу @ nailer выше , использование forEach с Object.keys означает, что вы можете избежать итерации по цепочке прототипов без использования hasOwnProperty.
источник
Я полагаю, что вы должны выбрать метод итерации в соответствии с вашими потребностями. Я хотел бы предложить вам на самом деле не когда - либо проходной выходец
Array
сfor in
структурой. Это намного медленнее и , как указывал Чейз Сейберт недавно, не совместимо с платформой Prototype.Существует отличный эталон для различных стилей зацикливания, на которые вам обязательно следует обратить внимание, если вы работаете с JavaScript . Не делайте ранних оптимизаций, но вы должны держать эти вещи где-то в затылке.
Я бы использовал,
for in
чтобы получить все свойства объекта, что особенно полезно при отладке ваших скриптов. Например, мне нравится иметь эту строку под рукой, когда я исследую незнакомый объект:Он выгружает содержимое всего объекта (вместе с телами методов) в мой журнал Firebug. Очень удобно
источник
вот что я сделал
это то, как вы будете использовать его,
это будет работать с массивами и объектами (такими как список элементов HTML)
Я просто сделал это, поэтому я открыт для предложений :)
источник
Я бы использовал разные методы, основанные на том, как я хотел ссылаться на элементы.
Используйте foreach, если вы просто хотите текущий элемент.
Используйте для, если вам нужен индексатор для сравнительных сравнений. (Т.е. как это соотносится с предыдущим / следующим пунктом?)
Я никогда не замечал разницу в производительности. Я подожду, пока возникнут проблемы с производительностью, прежде чем беспокоиться об этом.
источник
С помощью for (var i в myArray) вы также можете перебирать объекты, я буду содержать имя ключа и вы можете получить доступ к свойству через myArray [i] . Кроме того, любые методы, которые вы добавите к объекту, также будут включены в цикл, т. Е. Если вы используете какую-либо внешнюю среду, такую как jQuery или prototype, или если вы добавляете методы непосредственно в прототипы объектов, в какой-то момент я укажу на эти методы.
источник
Осторожно!
Если у вас есть несколько тегов сценария, и вы ищете информацию в атрибутах тега, например, вы должны использовать свойство .length с циклом for, потому что это не простой массив, а объект HTMLCollection.
https://developer.mozilla.org/en/DOM/HTMLCollection
Если вы используете оператор foreach для (var i в yourList), он вернет свойства и методы HTMLCollection в большинстве браузеров!
Даже если getElementsByTagName должен возвращать NodeList, большинство браузеров возвращают HTMLCollection: https://developer.mozilla.org/en/DOM/document.getElementsByTagName
источник
Ибо в циклах на массивах не совместим с прототипом. Если вы думаете, что вам может понадобиться использовать эту библиотеку в будущем, имеет смысл придерживаться циклов for.
http://www.prototypejs.org/api/array
источник
Я видел проблемы с «для каждого» с использованием объектов и прототипов и массивов
я понимаю, что для каждого для свойств объектов, а не массивов
источник
Если вы действительно хотите ускорить свой код, как насчет этого?
это своего рода логика while внутри оператора for, и она менее избыточна. Также Firefox имеет Array.forEach и Array.filter
источник
Более короткий и лучший код в соответствии с jsperf
источник
Используйте цикл Array (). ForEach, чтобы воспользоваться преимуществами параллелизма.
источник
Array.prototype.forEach
не будет выполнять несколько вызовов обратного вызова параллельно.для (;;) для массивов : [20,55,33]
for..in для объектов : {x: 20, y: 55: z: 33}
источник
Быть осторожен!!! Я использую Chrome 22.0 в Mac OS, и у меня проблемы с каждым синтаксисом.
Я не знаю, если это проблема браузера, проблема JavaScript или какая-то ошибка в коде, но это ОЧЕНЬ странно. Снаружи объекта работает отлично.
источник
Между ними есть важное различие. For-in перебирает свойства объекта, поэтому, когда case является массивом, он будет перебирать не только его элементы, но и функцию «удалить», которая у него есть.
Вы можете использовать for-in с
if(myArray.hasOwnProperty(i))
. Тем не менее, при переборе массивов я всегда предпочитаю избегать этого и просто использовать оператор for (;;).источник
Хотя они оба очень похожи, есть небольшая разница:
в этом случае вывод:
СТАНДАРТ ДЛЯ ПЕТЛИ:
ARRAY [0] = A
ARRAY [1] = B
ARRAY [2] = C
в то время как в этом случае вывод:
ВНЕШНЯЯ ПЕТЛЯ:
ARRAY [1] = B
ARRAY [2] = C
ARRAY [10] = D
ARRAY [ABC] = 123
источник
Оператор for позволяет выполнять циклический просмотр имен всех свойств объекта. К сожалению, он также проходит по всем элементам, унаследованным через цепочку прототипов. У этого есть плохой побочный эффект обслуживания функций метода, когда интерес к членам данных.
источник