|
|||
Инструкция for-in12.6.4 Инструкция for-in Значение нетерминала ИнструкцияИтерации : for ( ЛевостороннееВыражение in Выражение ) Инструкция вычисляется по следующей схеме: 1. Вычислить значение первого Выражения. 2. Вызвать ПолучитьЗначение(Результат(1)). 3. Вызвать ToObject(Результат(2)). 4. Пусть V = empty. 5. Получить имя следующего по очереди свойства Результата(3), которое не имеет свойства DontEnum. Если такого свойства нет - переход на шаг 14. 6. Вычислить значение ЛевостороннегоВыражения (оно может вычисляться на каждой итерации). 7. Вызвать ЗаписатьЗначение(Результат(6), Результат(5)). 8. Вычислить значение Инструкции. 9. Если Результат(8). значение не равно empty, приравнять V = Результат(8). значение. 10. Если Результат(8). тип равен break и Результат(8). цель принадлежит текущему набору меток - переход на шаг 14. 11. Если Результат(8). тип равен continue и Результат(8). цель принадлежит текущему набору меток - переход на шаг 5. 12. Если Результат(8) является неожиданным завершением, вернуть Результат(8). 13. Переход на шаг 5. 14. Вернуть (normal, V, empty). Значение нетерминала ИнструкцияИтерации : for (var ОбъявлениеПеременнойБезIn in Выражение ) Инструкция вычисляется по следующей схеме: 1. Вычислить значение ОбъявлениеПеременнойБезIn. 2. Вычислить значение Выражения. 3. Вызвать ПолучитьЗначение(Результат(2)). 4. Вызвать ToObject(Результат(3)). 5. Пусть V = empty. 6. Получить имя следующего по очереди свойства Результата(4), которое не имеет свойства DontEnum. Если такого свойства нет - переход на шаг 15. 7. Вычислить значение Результата(1) как будто это Идентификатор, см. раздел 0 (да, оно может вычисляться на каждой итерации). 8. Вызвать ЗаписатьЗначение(Результат(7), Результат(6)). 9. Вычислить значение Инструкции. 10. Если Результат(9). значение не равно empty, приравнять V = Результат(9). значение. 11. Если Результат(9). тип равен break и Результат(9). цель принадлежит текущему набору меток - переход на шаг 15. 12. Если Результат(9). тип равен continue и Результат(9). цель принадлежит текущему набору меток - переход на шаг 6. 13. Если Результат(8) является неожиданным завершением, вернуть Результат(8). 14. Переход на шаг 6. 15. Вернуть (normal, V, empty). Механизм обхода (перечисления) свойств (шаг 5 первого алгоритма, шаг 6 второго) зависит от конкретной реализации. Порядок обхода определяется объектом. Свойства обходимого объекта могут быть удалены во время обхода. Если свойство, которое ещё не было посещено, удаляется, то оно не будет посещено в оставшейся части обхода. Если новые свойства были добавлены к объекту во время перечисления, их посещение в оставшейся части обхода не гарантируется. Обход свойств объекта включает обход свойств его прототипа, прототипа прототипа и так далее рекурсивно. Однако свойство прототипа не обходится, если оно "перекрыто" свойством с тем же именем в каком-либо из объектов, предшествующих по иерархии прототипов.
|
|||
|