Я заметил, что при перечислении свойств объекта, что он выглядит как моментальный снимок текущих свойств, берется в начале цикла, а затем моментальный снимок повторяется. Я так чувствую, потому что следующее не создает бесконечный цикл:
var obj = {a:0,b:0}, i=0;
for (var k in obj) {
obj[i++] = 0;
}
alert(i) // 2
demo http://jsfiddle.net/kqzLG/
Приведенный выше код демонстрирует, что я добавляю новые свойства, но новые свойства не будут перечислены.
Однако оператор удаления, похоже, бросает вызов моей теории моментальных снимков. Здесь тот же код, но удаляет свойство до того, как оно будет перечислить.
var obj = {a:0,b:0}, i=0;
for (var k in obj) {
i++;
delete obj.b;
}
alert(i) // 1
demo http://jsfiddle.net/Gs2vh/
Приведенный выше код демонстрирует, что тело цикла выполняется только один раз. Он выполнил бы два раза, если бы теория моментальных снимков была правдой.
Что здесь происходит? Есть ли у javascript какой-то скрытый итератор, который он использует, и оператор удаления каким-то образом знает об этом?
- Я понимаю, что я предполагаю что-то об итерационном заказе, в частности, что итерация происходит в зависимости от времени ввода свойства. Я считаю, что все браузеры используют такую реализацию.