Is het veilig om een ​​objecteigenschap te verwijderen terwijl deze wordt herhaald?

Is het tijdens het herhalen van de eigenschappen van een object veilig om ze te verwijderen in een for-in-lus?

Bijvoorbeeld:

for (var key in obj) {
    if (!obj.hasOwnProperty(key)) continue;
    if (shouldDelete(obj[key])) {
        delete obj[key];
    }
}

In veel andere talen is het onveilig om een ​​array of woordenboek te herhalen en daarin te verwijderen. Is het goed in JS?

(Ik gebruik Mozilla’s Spidermonkey runtime.)


Antwoord 1, autoriteit 100%

De ECMAScript 5.1-standaardsectie 12.6.4 (aan voor -in loops) zegt:

Eigenschappen van het object dat wordt geïnventariseerd, kunnen tijdens de opsomming worden verwijderd. Als een woning
dat tijdens de telling nog niet is bezocht, wordt verwijderd, daarna wordt het niet bezocht. Als nieuwe eigenschappen zijn
toegevoegd aan het object dat tijdens de telling wordt geteld, is het niet gegarandeerd dat de nieuw toegevoegde eigenschappen
worden bezocht in de actieve opsomming. Een eigenschapsnaam mag niet meer dan één keer in een opsomming worden bezocht.

Dus ik denk dat het duidelijk is dat de OP-code legaal is en zal werken zoals verwacht. De eigenaardigheden van de browser zijn van invloed op de iteratievolgorde en verwijderinstructies in het algemeen, maar niet op de vraag of de OPs-code zal werken. Het is over het algemeen het beste om alleen de huidige eigenschap in de iteratie te verwijderen – het verwijderen van andere eigenschappen in het object zal er onvoorspelbaar toe leiden dat ze worden opgenomen (indien al bezocht) of niet worden opgenomen in de iteratie, hoewel dat al dan niet een probleem kan zijn, afhankelijk van de situatie.

Zie ook:

Geen van deze heeft echter echt invloed op de OP-code.


Antwoord 2, autoriteit 13%

Van de Javascript/ECMAScript-specificatie(specifiek 12.6.4 De for-in-verklaring):

Eigenschappen van het object dat wordt opgesomd, kunnen worden verwijderd tijdens
opsomming
. Als een pand dat nog niet is bezocht tijdens
opsomming wordt verwijderd, dan wordt deze niet bezocht. Als nieuwe eigenschappen
worden toegevoegd aan het object dat wordt geteld tijdens de opsomming, de newly
toegevoegde eigenschappen worden niet gegarandeerd bezocht in de active
opsomming
. Een eigenschapsnaam mag niet vaker dan één keer worden bezocht
opsomming.

Other episodes