2015-06-14 2 views
0
A = { 1:1, 2:2, 3:3, 4:4, 5:5 }; 
for (var i in A) { 
    console.log(i); 
    if (A[i] == 4) delete A[i], A[7] = 7; 
    if (A[i] == 2) delete A[i], A[0] = 0; 
    if (A[i] == 7) console.log('seven'); 
    if (A[i] == 0) console.log('zero'); 
} 
console.log(A); 

Это похоже на работу, но я не знаю деталей реализации цикла for (.. in ..), чтобы убедиться, что он безопасен в большинстве условий.Безопасно ли модифицировать объект внутри цикла (..in ..)?

See also here the same question about arrays.

+0

http://es5.github.io/#x12.6.4 – Teemu

ответ

1

According the MDN reference вы не должны пытаться это сделать

Если свойство изменяется в одной итерации, а затем побывал в более позднее время , его значение в цикле является его значение в то позднее время.

Свойство, которое было удалено до его посещения, не будет посещен позже.

Свойства, добавленные к объекту, по которому происходит итерация , могут быть посещены или опущены на итерации.

В целом лучше не добавлять, изменять и не удалять свойства объекта во время итерации, за исключением находящейся в настоящее время недвижимости.

Там нет никакой гарантии, будет ли или не добавлено свойство быть посетило, будет ли посетить модифицированное имущество (кроме текущего) до или после того, как он будет изменен, или будет ли посетить удаленную недвижимость прежде чем он будет удален.

Так что, хотя это, возможно, работало в ваших тестах до сих пор, это может быть не всегда.

0

С помощью этого метода вы могли бы потенциально пропустить индексы A, потому что, как вы удалите элементы, индексы всех остальных элементов будут смещаться на -1, а затем, возможно, по пропущено итератору. Вместо этого вы можете создать второй список, а затем добавить только хорошие значения от A.

Смежные вопросы