Меня интересует порядок обращения к элементам в массиве с помощью цикла FOR IN. А то есть с какого элемента начинает и каков принцип выборки.
Цикл for...in проходит через перечисляемые свойства объекта, в произвольном порядке
for...in не следует использовать для Array, где важен порядок индексов.
Индексы массива перечисляемые свойства с целочисленными именами, а в остальном аналогичны объектам. Нет гарантии, что for...in будет возвращать индексы в нужном порядке и вернёт все перечисляемые свойства, включая имеющие нецелочислененные имена и наследуемые
Вдобавок, порядок обхода зависит от реализации ECMAScript браузером
стандарт ECMAScript оставляет порядок итерации по свойствам объектов на усмотрение реализующей стороны
Для массивов предпочтительней использовать простой for
Сначала переберутся числовые ключи соответствующие индексам начиная с 0, затем все остальные строковые ключи.
Для различных вариантов for..in вызывается одна и та же внутренняя функция
IterationStatement: for ( LeftHandSideExpression in Expression ) Statement
IterationStatement: for ( var ForBinding in Expression ) Statement
IterationStatement: for ( ForDeclaration in Expression ) Statement
Если перейти к этой функции можно найти алгоритм, который определяет получение свойств. Интересен пункт 6
exprValue.[[Value]] равен null или undefined, тогда
Completion{[[Type]]: break, [[Value]]: empty, [[Target]]: empty}.ToObject(exprValue).Именно в функции EnumerateObjectProperties(obj) и осуществляется перебор.
В ее описании можно найти следующий пункт:
Возвращает объект итератора проходящего по всем Строковым ключам перебираемых свойств объекта O. Механика и порядок перечисления свойств не определен, но должен соответствовать правилам указанным ниже.
В нашем случае интересны следующие правила:
И наконец, пришли к главному: [[OwnPropertyKeys]]. Если объект не строка или TypedArray вызывается OrdinaryOwnPropertyKeys (O) в которой выполняются следующие шаги:
В итоге в тело for..in попадет сначала целочисленные ключи больше либо равные 0 в порядке возрастания, затем строковые, которые не могут быть представлены целым числом больше либо равным 0, в порядке добавления в объект. А так же после этого в том же порядке добавятся перечисляемые свойства из прототипа.
Можно отметить, что поведение массива, в данном случае ничем не отличается от поведения обычного объекта.
Продвижение своими сайтами как стратегия роста и независимости