Хелпикс

Главная

Контакты

Случайная статья





Инструкция for-in



12.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 второго) зависит от конкретной реализации. Порядок обхода определяется объектом. Свойства обходимого объекта могут быть удалены во время обхода. Если свойство, которое ещё не было посещено, удаляется, то оно не будет посещено в оставшейся части обхода. Если новые свойства были добавлены к объекту во время перечисления, их посещение в оставшейся части обхода не гарантируется.

Обход свойств объекта включает обход свойств его прототипа, прототипа прототипа и так далее рекурсивно. Однако свойство прототипа не обходится, если оно "перекрыто" свойством с тем же именем в каком-либо из объектов, предшествующих по иерархии прототипов.



  

© helpiks.su При использовании или копировании материалов прямая ссылка на сайт обязательна.