JavaScript для ... в сравнении с - PullRequest
       44

JavaScript для ... в сравнении с

449 голосов
/ 28 октября 2008

Как вы думаете, есть большая разница в циклах for ... in и for? Какое «для» вы предпочитаете использовать и почему?

Допустим, у нас есть массив ассоциативных массивов:

var myArray = [{'key': 'value'}, {'key': 'value1'}];

Итак, мы можем повторить:

for (var i = 0; i < myArray.length; i++)

И

for (var i in myArray)

Я не вижу большой разницы. Есть ли проблемы с производительностью?

Ответы [ 23 ]

6 голосов
/ 28 октября 2008

Я бы использовал разные методы, основанные на том, как я хотел ссылаться на элементы.

Используйте foreach, если вы просто хотите текущий элемент.

Используйте для, если вам нужен индексатор для сравнительных сравнений. (Т.е. как это соотносится с предыдущим / следующим пунктом?)

Я никогда не замечал разницу в производительности. Я подожду, пока возникнет проблема с производительностью, прежде чем беспокоиться об этом.

4 голосов
/ 28 октября 2008

С помощью для (var i в myArray) вы также можете перебирать объекты, i будет содержать имя ключа, и вы можете получить доступ к свойству через myArray [i] . Кроме того, любые методы, которые вы добавите к объекту, также будут включены в цикл, т. Е. Если вы используете какую-либо внешнюю среду, такую ​​как jQuery или prototype, или если вы добавляете методы непосредственно в прототипы объектов, в один момент i будет указывать на эти методы.

4 голосов
/ 08 мая 2012

Берегись!

Если у вас есть несколько тегов сценария, и вы ищете информацию в атрибутах тега, например, вы должны использовать свойство .length с циклом for, поскольку это не простой массив, а объект HTMLCollection.

https://developer.mozilla.org/en/DOM/HTMLCollection

Если вы используете оператор foreach для (var i в yourList), он вернет свойства и методы HTMLCollection в большинстве браузеров!

var scriptTags = document.getElementsByTagName("script");

for(var i = 0; i < scriptTags.length; i++)
alert(i); // Will print all your elements index (you can get src attribute value using scriptTags[i].attributes[0].value)

for(var i in scriptTags)
alert(i); // Will print "length", "item" and "namedItem" in addition to your elements!

Даже если getElementsByTagName должен возвращать NodeList, большинство браузеров возвращают HTMLCollection: https://developer.mozilla.org/en/DOM/document.getElementsByTagName

3 голосов
/ 09 мая 2015

Более короткий и лучший код по jsperf -

keys  = Object.keys(obj);
for (var i = keys.length; i--;){
   value = obj[keys[i]];// or other action
}
3 голосов
/ 28 октября 2008

Ибо в циклах на массивах не совместим с прототипом. Если вы считаете, что вам может понадобиться использовать эту библиотеку в будущем, имеет смысл придерживаться циклов for.

http://www.prototypejs.org/api/array

3 голосов
/ 28 октября 2008

Я видел проблемы с «для каждого» при использовании объектов, прототипов и массивов

я понимаю, что для каждого из них для свойств объектов, а не массивов

3 голосов
/ 26 июня 2010

Если вы действительно хотите ускорить свой код, как насчет этого?

for( var i=0,j=null; j=array[i++]; foo(j) );

это своего рода логика while внутри оператора for, и она менее избыточна. Также Firefox имеет Array.forEach и Array.filter

1 голос
/ 09 февраля 2016

для (;;) для Массивы : [20,55,33]

для ... в для объектов : {x: 20, y: 55: z: 33}

1 голос
/ 28 апреля 2012

Используйте цикл Array (). ForEach, чтобы воспользоваться преимуществами параллелизма

0 голосов
/ 28 февраля 2018

Оператор for in позволяет циклически проходить по именам всех свойств объекта. К сожалению, он также проходит по всем элементам, унаследованным через цепочку прототипов. У этого есть плохой побочный эффект обслуживания функций метода, когда интерес к элементам данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...