Какая разница, если при выполнении цикла Lavascript использовать операторы «in» и «=»? - PullRequest
0 голосов
/ 16 декабря 2011

Какая разница, если я использую одно из следующих для итерации массивов JavaScript:

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

или

for (var i in abc.lengh)

Спасибо.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2011

Для итерации элементов массива вы должны использовать эту форму:

var x = [1,2,3,4];

for (var i = 0, len = x.length; i < len; i++) {
    // code here to access x[i]
}

Для итерации свойств объекта вы должны использовать это:

var house = {size: 3200, bedrooms: 5, garage: 2, color: "white", city: "San Francisco"};

for (var key in house) {
    // access each property here as house[key]
}

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

Добавление переменной len в первом синтаксисе является оптимизацией скорости, потому что извлечение длины в локальную переменную может быть значительно быстрее, чем доступ к свойству длины на каждой итерации цикла. Это не обязательно делать так. Это можно сделать так же:

for (var i = 0; i < x.length; i++)
1 голос
/ 16 декабря 2011

Первый пример (цикл 'for') будет повторять элементы массива и является предпочтительным методом циклического перемещения по массиву.

Последний метод (a 'for ... in'loop) будет перебирать все свойства объекта и обычно более полезна для более сложных объектов, чем для массивов.Если вы добавили какие-либо пользовательские свойства в объект массива, цикл for ... in также будет выполнять их итерацию, что не всегда желательно.

Еще одна вещь, о которой следует помнить при for...в циклах - они могут (в зависимости от браузера) не перебирать объект в том порядке, в котором вы ожидаете.Подробнее об этом см. Ответ на другой вопрос: https://stackoverflow.com/a/280861/726326

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