ECMAScript 5.1 стандартний розділ 12.6.4 (на за-петлях) говорить:
Властивості об'єкта, який перераховується, можуть бути видалені під час перерахування. Якщо майно, яке ще не було відвідано під час перерахування, буде видалено, воно не буде відвідуватися. Якщо до об’єкту, який перераховується під час перерахування, додаються нові властивості, щойно додані властивості не будуть гарантовано відвідуватися в активному перерахуванні. Ім’я власності не повинно відвідуватися більше одного разу в будь-якому перерахунку.
Тож я думаю, що зрозуміло, що код ОП є законним і працюватиме так, як очікувалося. Вигадки браузера впливають на порядок ітерації та видалення операторів загалом, але не те, чи спрацює код ОП. Як правило, найкраще лише видалити поточне властивість під час ітерації - видалення інших властивостей об'єкта непередбачувано спричинить їх включення (якщо вже відвідане) або не включення в ітерацію, хоча це може викликати або не викликати занепокоєння залежно від ситуація.
Дивитися також:
Жодне з них насправді не впливає на код OP.