Изменение ассоциативного массива Javascript во время цикла

Ключевое слово javascript for будет перебирать все свойства объекта. Если объект изменен внутри тела цикла, что происходит?

Например, следующий код ОК?

for(var key in obj)
    if (whatever(obj[key]))
        delete obj[key];

ОК будет, если этот код работает детерминированным образом и желательно, чтобы все ключи в obj проверялись ровно один раз. Напротив, в .NET или Java подобные конструкции обычно генерируют исключение.

Ответ 1

Я думаю, что это работает. Просто будьте осторожны, попросите hasOwnProperty(key) - потому что for также будет радостно перебирать унаследованные свойства (и методы, которые являются просто свойствами со значениями функций).

Также: http://www.w3schools.com/js/js_loop_for_in.asp говорит:

Примечание. Код в теле цикла for... in выполняется один раз для каждого свойства.

Также: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in говорит:

A for... in loop выполняет итерации по свойствам объекта в произвольном порядке (более подробно о том, почему нельзя зависеть от кажущейся упорядоченности итерации, по крайней мере, в настройках кросс-браузера). Если свойство изменено на одной итерации, а затем посещено позднее, значение, выставленное циклом, будет его значением в это позднее время. Свойство, которое удаляется до его посещения, затем не будет посещаться позже. Свойства, добавленные к объекту, через который происходит итерация, могут быть либо посещены, либо опущены на итерации. В общем случае лучше не добавлять, изменять и не удалять свойства объекта во время итерации, кроме свойства, которое в настоящее время посещается; нет гарантии, будет ли добавлено добавленное свойство, будет ли измененное свойство посещено до или после его изменения, или будет ли удаленное свойство посещено до его удаления.

То, что я прочитал из этого, - если вы изменяете значения, отличные от текущего, то недетерминизм может укусить вас в задницу. Однако изменение текущего должно быть в порядке.