Üzerinde yineleme yaparken bir nesne özelliğini silmek güvenli midir?


102

Bir nesnenin özelliklerini yinelerken, bir for-in döngüsü içindeyken bunları silmek güvenli midir?

Örneğin:

for (var key in obj) {
    if (!obj.hasOwnProperty(key)) continue;

    if (shouldDelete(obj[key])) {
        delete obj[key];
    }
}

Diğer birçok dilde bir dizi veya sözlük üzerinde yineleme yapmak ve bunun içini silmek güvenli değildir. JS'de tamam mı?

(Mozilla'nın Spidermonkey çalışma zamanını kullanıyorum.)


Bu soru üzerine bir ödül başlattım çünkü mevcut cevabın yetersiz olduğunu ve soruyu sunulduğu şekliyle cevaplamadığını düşünüyorum . Lütfen aynı zamanda ilgili bir kaynak (umarız spesifikasyondan) ve varsa dikkate değer tarayıcı "tuhaflıkları" ekleyin.
user2864740

Yanıtlar:


120

ECMAScript 5.1 standart söyler (hazır döngüler üzerinde) bölümünde 12.6.4:

Numaralandırılan nesnenin özellikleri numaralandırma sırasında silinebilir. Numaralandırma sırasında henüz ziyaret edilmemiş bir mülk silinirse, o zaman ziyaret edilmeyecektir. Numaralandırma sırasında numaralandırılan nesneye yeni özellikler eklenirse, yeni eklenen özelliklerin etkin numaralandırmada ziyaret edilmesi garanti edilmez. Bir mülk adı herhangi bir numaralandırmada birden fazla ziyaret edilmemelidir.

Bu yüzden, OP'nin kodunun yasal olduğu ve beklendiği gibi çalışacağının açık olduğunu düşünüyorum. Tarayıcı tuhaflıkları, yineleme sırasını ve genel olarak silme ifadelerini etkiler, ancak OP kodunun çalışıp çalışmayacağını etkilemez. Yinelemede yalnızca geçerli mülkü silmek genellikle en iyisidir - nesnedeki diğer özelliklerin silinmesi, öngörülemeyen bir şekilde bunların dahil edilmesine (zaten ziyaret edilmişse) veya yinelemeye dahil edilmemesine neden olur, ancak bu, duruma bağlı olarak bir endişe olabilir veya olmayabilir. durum.

Ayrıca bakınız:

Bunların hiçbiri OP'nin kodunu gerçekten etkilemez.


1
Diğer cevapla aynı standart teklifini eklediğimi fark ettim, özür dilerim.
TomW

17

Kaynaktan JavaScript / ECMAScript tarifnamede (özellikle 12.6.4 for-in Tablosuna ):

Numaralandırılan nesnenin özellikleri numaralandırma sırasında silinebilir . Numaralandırma sırasında henüz ziyaret edilmemiş bir mülk silinirse, o zaman ziyaret edilmeyecektir. Numaralandırma sırasında numaralandırılan nesneye yeni özellikler eklenirse, yeni eklenen özelliklerin etkin numaralandırmada ziyaret edilmesi garanti edilmez . Bir mülk adı, herhangi bir numaralandırmada birden fazla ziyaret edilmemelidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.