90 votes

Est-il sécuritaire de supprimer une propriété de l'objet lors de l'itération sur eux?

Lors de l'itération sur les propriétés d'un objet, est-il sécuritaire de supprimer tout en un pour-en boucle?

Par exemple:

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

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

Dans de nombreuses autres langues itération sur un tableau ou un dictionnaire et la suppression de l'intérieur qui est dangereux. Est-il acceptable en JS?

(J'utilise Mozilla Spidermonkey l'exécution.)

104voto

TomW Points 452

L' ECMAScript standard 5.1 section 12.6.4 (sur les boucles for-in) dit:

Les propriétés de l'objet énumérés peuvent être supprimés au cours de l'énumération. Si une propriété qui n'a pas encore été visités au cours de l'énumération est supprimé, il ne sera pas visité. Si de nouvelles propriétés sont ajoutée à l'objet énuméré au cours de l'énumération, le nouvellement ajouté propriétés ne sont pas garantis être visité à l'actif de l'énumération. Un nom de propriété ne doit pas être visité plus d'une fois dans n'importe quel énumération.

Donc, je pense qu'il est clair que l'OP du code juridique et fonctionneront comme prévu. Navigateur bizarreries affecter itération de commande et supprimer des états en général, mais pas si OPs code du travail. Il est généralement préférable que de les supprimer de la propriété courante dans l'itération - la suppression des autres propriétés de l'objet de façon imprévisible cause (si déjà visité) ou non inclus dans l'itération, mais qui peut ou ne peut pas être un sujet de préoccupation en fonction de la situation.

Voir aussi:

Aucun de ces affecte vraiment l'OP du code.

16voto

Chill Points 335

À partir du Javascript/spécification ECMAScript (plus précisément 12.6.4 La pour-dans l'Énoncé):

Les propriétés de l'objet énuméré peut être supprimé lors de l' l'énumération. Si une propriété qui n'a pas encore été visités au cours de l'énumération est supprimé, il ne sera pas visité. Si de nouvelles propriétés sont ajoutés à l'objet énuméré au cours de l'énumération, le nouvellement les propriétés ajoutées ne sont pas garantis pour être visité dans l'active l'énumération. Un nom de propriété ne doit pas être visité plus d'une fois en tout l'énumération.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X