Lors d'une itération sur les propriétés d'un objet, est-il sûr de les supprimer dans une boucle for-in?
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érer sur un tableau ou un dictionnaire et en supprimer à l'intérieur n'est pas sûr. Est-ce que ça va dans JS?
(J'utilise le runtime Spidermonkey de Mozilla.)
javascript
loops
object
properties
Joe Shaw
la source
la source
Réponses:
La section 12.6.4 de la norme ECMAScript 5.1 (sur les boucles for-in) dit:
Je pense donc qu'il est clair que le code du PO est légal et fonctionnera comme prévu. Les bizarreries du navigateur affectent l'ordre d'itération et suppriment les instructions en général, mais pas si le code OP fonctionnera. Il est généralement préférable de supprimer uniquement la propriété actuelle dans l'itération - la suppression d'autres propriétés de l'objet entraînera de manière imprévisible leur inclusion (si déjà visitée) ou non incluse dans l'itération, bien que cela puisse ou non être un problème selon le situation.
Voir également:
Cependant, aucun de ces éléments n'affecte vraiment le code de l'OP.
la source
À partir de la spécification Javascript / ECMAScript (spécifiquement 12.6.4 l'instruction for-in ):
la source