Принцип механизма цикла в javascript for in или jquery each?
Привет!
У меня в яваскрипте есть объект, каждое свойство которого число, значение такого свойства объект. Когда я добавляю новое свойство, а после перебираю все свойства, то они идут в порядке увелечения числа (которое является ключом свойства) — так устроен js. Мой вопрос связан вот с чем:
если я начинаю перебор (через for in или jquery.each) и в это время срабатывает событие которое добавляет новое свойство, которое (из-за самого большого ключа) должно быть последним в списке правил, то попадет ли оно в перебор с учетом того что курсор цикла еще не дошел до него? Другими словами создает ли яваскрипт копию оригинального объекта при переборе его свойств или нет?
большое спасибо за вашу инициативу отвечать в каждом вопросе, однако если бы вы уделяли чуть больше внимания вопросам на которые отвечаете, возможно ваши ответы несли бы какую-нибудь пользу.
Пишите более понятно. У нас общая проблема, в формулировках. 2 примера:
Прошу прощение, но в это время срабатывает событие и код if (name==2) a[5] = 'e'; не соответствует термину «событие», это есть тело цикла. Я решил что без слова «событие» ответ есть выше. Так как вопрос читал внимательно, то счел своим долгом объяснить не совсем очевидный факт. То есть ситуации, когда минуту выполняется цикл, и на 5 секунде от начала пользователь щелкает по кнопке, в обработчике которой меняются данные связанные с циклом — то сначала полностью выполнится цикл, а лишь потом выполнится обработчик.
По поводу вопроса о Meteor.js — так сформулированный вопрос подразумевал именно такой ответ. А по поводу подробнее — так в самом концепте meteor.js ответ. Вот сели бы был пример что именно получается — тогда можно было бы конкретно ответить.
Подтверждаю. Реализация поведения енумераторов при изменении хэша тоже не определена.
Но в целом, как ни странно на большой тройке браузеров будет работать так как пишет автор. Очень хороший пример, по чему в программировании «практика не есть критерием истины».
>… так устроен js.
В половине браузеров он не так устроен. Firefox, Safari — ключи-числа идут в порядке объявления. В старой Опере что-то вообще необычное. Зато нечисловые ключи у всех идут в порядке объявления, хотя это, как написано, не гарантируется. Просто не пользуйтесь в объектах числовыми ключами, чтобы не попадать на эти грабли.
> Не попадёт.
… А вот в коллекциях DOM-элементов список живой. Так что всё от реализации зависит.
Автор модуля jParser в README упомянул, что во всех браузерах (и в Node.js) обход свойств объекта происходит в порядке их вставки в объект при соблюдении двух условий:
Имя свойства не должно начинаться цифрою.
Не следует добавлять в объект свойство, одноимённое ранее существующему.