web-dev-qa-db-fra.com

Quand dois-je utiliser la suppression par rapport aux éléments de réglage à null en JavaScript?

Duplicata possible:
Suppression d'objets en JavaScript

J'ai un objet JS ayant un grand nombre de propriétés. Si je veux forcer le navigateur à récupérer cet objet, dois-je définir chacune de ces propriétés sur null ou dois-je utiliser l'opérateur de suppression? Quelle est la différence entre les deux?

66
jeffreyveon

Il n'y a aucun moyen de forcer le ramasse-miettes en JavaScript, et vous n'en avez pas vraiment besoin. x.y = null; et delete x.y; éliminent tous les deux la référence de x à l'ancienne valeur de y. La valeur sera récupérée si nécessaire.

Si vous annulez une propriété, elle est toujours considérée comme "définie" sur l'objet et sera énumérée. La seule fois où je peux penser à l'endroit où vous préférez delete est si vous étiez va énumérer les propriétés de x.

Considérer ce qui suit:

var foo = { 'a': 1, 'b': 2, 'c': 3 };

console.log('Deleted a.');
delete foo.a
for (var key in foo)
  console.log(key + ': ' + foo[key]);

console.log('Nulled out b.');
foo['b'] = null;
for (var key in foo)
  console.log(key + ': ' + foo[key]);

Ce code produira la sortie suivante:

Deleted a.
b: 2
c: 3
Nulled out b.
b: null
c: 3
146
Annabelle

Les propriétés des objets Javascript sont généralement implémentées avec une table de hachage. La définition de null laisse la clé dans la table de hachage pointant vers une valeur nulle, tandis que la suppression supprime à la fois la clé et la valeur.

La principale différence observable entre les deux est que si vous parcourez les clés avec une boucle for..in, la suppression des clés entraîne moins d'entrées vues par l'itération.

Je suggérerais de préférer la suppression en général, à moins que vous n'ayez à définir et à effacer à plusieurs reprises les mêmes clés, ce qui militerait pour laisser la structure de la table de hachage en place. Cependant, toute différence de performances entre les deux techniques va être incommensurablement petite dans tous les cas typiques.

-m @

16
Matt DiMeo

Il n'y a aucun moyen de forcer la récupération de place à un moment précis en JavaScript. Chaque moteur JavaScript a sa propre façon de gérer cela.

Cependant, vous pouvez vous assurer que vos objets ne sont référencés nulle part. La définition de leur valeur nulle ou leur suppression fait en fait la même chose (supprimer ne supprime jamais l'objet - il n'enlève qu'une référence à lui). Lorsque le garbage collection s'exécute, il vérifie s'il existe des références à un objet donné - puis, sinon, il le supprime de la mémoire. C'est là que se produisent les fuites de mémoire (un objet JavaScript fait référence à un objet DOM et vice-versa).

Assurez-vous de supprimer toutes les références et tout ira bien.

1
Gabriel McAdams