Модификация ассоциативного массива Javascript во время цикла for - PullRequest
6 голосов
/ 21 мая 2011

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

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

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

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

1 Ответ

8 голосов
/ 21 мая 2011

Я думаю, что это работает.Просто будьте осторожны, чтобы спросить 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 говорит:

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

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

...