226 votes

Comment effacer rapidement un objet Javascript?

Avec un Tableau Javascript, je peux le remettre à un état vide avec une seule mission:

array.length = 0;

Cela rend le Tableau "semble" vide et prêt à réutiliser, et aussi loin que je comprends, c'est une simple "opération" - c'est-à temps constant.

Est-il une manière similaire pour effacer un Objet JS? Je sais que je peux effectuer une itération de son champs de les supprimer:

for (prop in obj) { if (obj.hasOwnProperty(prop)) { delete obj[prop]; } }

mais cela a linéaire de la complexité.

Je peux aussi simplement jeter l'objet et en créer un nouveau:

obj = {};

Mais "promiscuous" la création de nouveaux objets conduit à des problèmes avec la Collecte des Ordures sur IE6. (Comme décrit ici)

153voto

Wytze Points 2689

Au risque de rendre les choses trop faciles ...

 for (var member in myObject) delete myObject[member];
 

... semblerait assez efficace pour nettoyer l'objet dans une ligne de code avec un minimum de crochets effrayants. Tous les membres seront réellement supprimés au lieu d'être laissés à la poubelle.

De toute évidence, si vous souhaitez supprimer l'objet lui-même, vous devrez toujours effectuer une suppression distincte () pour cela.

62voto

jthompson Points 2854

La réponse courte à votre question, je pense, n'est pas (il vous suffit de créer un nouvel objet).

  1. Dans cet exemple, je crois que le réglage de la longueur de 0 laisse encore tous les éléments pour la collecte des ordures.

  2. Vous pouvez ajouter cet Objet.prototype si c'est quelque chose qui vous utilisez fréquemment. Oui, c'est linéaire dans la complexité, mais tout ce qui ne fait pas de collecte des ordures par la suite.

  3. C'est la meilleure solution. Je sais que c'est pas lié à votre question - mais pour combien de temps devons-nous continuer de supporter IE6? Il existe de nombreuses campagnes de cesser l'utilisation de celui-ci.

N'hésitez pas à corriger moi si il n'y a rien incorrect au-dessus.

7voto

Martijn Points 6412

Donc, pour résumer votre question: vous voulez éviter, autant que possible, de la difficulté avec le IE6 GC bug. Ce bug a deux causes:

  1. La Collecte des ordures se produit une fois tous les si nombreuses attributions; par conséquent, plus les allocations que vous faites, le plus souvent GC ne sera pas exécuté;
  2. Plus les objets que vous avez ‘en l'air', le plus de temps chaque Collecte des Ordures course (car il va ramper à travers l'ensemble de la liste des objets pour voir qui sont marqués comme des ordures).

La solution à la cause 1 semble être: maintenir le nombre d'allocations; attribuer de nouveaux objets et des cordes aussi peu que possible.

La solution 2 de la cause semble être: le nombre de "vivre" les objets vers le bas; supprimer vos chaînes et les objets dès que vous n'en avez plus besoin, et de les créer à nouveau si nécessaire.

Dans une certaine mesure, ces solutions sont contradictoires: conserver le nombre d'objets dans la mémoire faible entraînera plus d'allocations et de fonds. À l'inverse, constamment en réutilisant les mêmes objets pourrait signifier de garder plus les objets en mémoire que ce qui est strictement nécessaire.


Maintenant, pour votre question. Si vous allez réinitialiser un objet par en créer une nouvelle, ou par la suppression de toutes ses propriétés: cela dépendra de ce que vous voulez faire avec elle par la suite.

Vous aurez probablement envie de leur attribuer de nouvelles propriétés:

  • Si vous le faites immédiatement, alors je suggère attribution de nouvelles propriétés d'emblée, et de sauter la suppression ou de compensation en premier. (Assurez-vous que toutes les propriétés sont soit remplacé ou supprimé, si!)
  • Si l'objet ne sera pas utilisé immédiatement, mais sera repeuplé à un stade ultérieur, alors je suggère de le supprimer ou de l'affecter la valeur null, et en créer un nouveau plus tard.

Il n'y a pas rapide, facile à utiliser pour effacer un objet de JScript pour les réutiliser comme si c'était un objet sans en créer une nouvelle. Ce qui signifie que la réponse courte à votre question est "Non", comme jthompson dit.

1voto

Ven Points 7349

Vous pouvez supprimer les appui verticaux, mais ne supprimez pas les variables. ``n’est pas valide dans l’ES5 (et jette avec utilisation stricte).

Vous pouvez l’affecter null à définir pour la suppression de la GC (il ne sera pas si vous avez d’autres références à des propriétés)

Mise en `` propriété sur un objet ne change rien. (il ne, Eh bien, affecte à la propriété)

-3voto

Zak Henry Points 490

Alors que ce n'est pas la réponse à votre question de la compensation d'un objet javascript, j'ai trouvé que si vous utilisez des objets comme des tableaux associatifs une façon de vider le tableau associatif est d'avoir de la structure du tableau associatif comme un tableau d'objets.

Par exemple.

var arr = []; //new array

var obj = {}; //new object
obj.foo = 'bar'; //put in some properties
obj.baz = 'qux';

arr.push(obj); //add object to array

De cette façon, vous avez un tableau associatif qui peut facilement être vidé par

arr.length = 0;

Comme pour la collecte des ordures performance, je ne suis pas sûr de savoir comment cette technique. Peut-être quelqu'un d'autre le sait?

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