Меня интересует порядок обращения к элементам в массиве с помощью цикла 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, в порядке добавления в объект. А так же после этого в том же порядке добавятся перечисляемые свойства из прототипа.
Можно отметить, что поведение массива, в данном случае ничем не отличается от поведения обычного объекта.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Много мануалов на эту тему, но что-то пока ни один не дал нужного результата
Установил этот плагин, пытаюсь импортировать файл, в indexhtml ввожу //= footer
Числовое значение с сайта можно получить так:
Использую fancybox для открытия модальных оконПоявился вопрос