Un objet reçu d'une API contient un champ que vous ne voulez pas transmettre plus loin, un mot de passe temporaire ou un identifiant interne. Il faut le retirer, pas simplement le vider : une clé mise à undefined reste dans l'objet et ressort dans la plupart des inspections.
delete est le seul opérateur du langage capable de faire disparaître une clé pour de bon.
Définition
delete retire une propriété d'un objet. La clé disparaît de l'objet, ainsi que sa valeur, et l'opérateur renvoie un booléen indiquant si l'objet ne porte plus cette propriété.
const client = { nom: 'Marie', motDePasse: 'secret' };
delete client.motDePasse;
console.log(client); // { nom: 'Marie' }
console.log('motDePasse' in client); // falseLa différence avec une mise à undefined se voit tout de suite : après client.motDePasse = undefined, la clé figure encore dans Object.keys() et l'opérateur in répond true.
delete renvoie true même quand la propriété n'existait pas. Le retour ne signifie donc pas « quelque chose a été supprimé », mais « la propriété n'est plus là ». Il ne vaut false, ou lève une erreur dans un module, que sur une propriété protégée, par exemple après un Object.freeze().
Sur un tableau, c'est une mauvaise idée
Un Array (tableau) est un objet, donc l'opérateur y fonctionne. Le résultat surprend : la case est vidée, mais elle reste comptée.
const notes = [12, 15, 8];
delete notes[1];
console.log(notes.length); // 3, inchangé
console.log(1 in notes); // false
console.log(notes[1]); // undefinedLe tableau garde un trou, que les méthodes de parcours traitent chacune à leur manière. Pour retirer réellement un élément, utilisez splice(), qui décale les suivants, ou Array.filter(), qui produit un nouveau tableau sans toucher à l'original.
Les alternatives à connaître
| Besoin | Écriture recommandée |
|---|---|
| Retirer un champ sans modifier l'objet | const { motDePasse, ...reste } = client |
| Retirer un élément d'un tableau | notes.filter((n, i) => i !== 1) |
| Retirer une clé dynamique souvent | Un Map et sa méthode delete() |
La première ligne s'appuie sur le Rest (...) et sur la Destructuration : elle crée un objet privé du champ nommé, sans modifier celui d'origine. C'est l'écriture la plus courante dans les projets modernes, où l'on préfère produire une copie que transformer une donnée partagée.
Questions fréquentes
delete libère-t-il de la mémoire ?
Pas directement. Il retire un lien vers une valeur ; c'est le ramasse-miettes du moteur qui libérera la mémoire, et seulement si plus rien d'autre ne pointe vers cette valeur. Supprimer une propriété qui référence un gros objet encore utilisé ailleurs ne fait donc rien gagner.
Peut-on supprimer une variable avec delete ?
Non. L'opérateur ne travaille que sur les propriétés d'un objet : une variable déclarée avec const, let ou var lui échappe, et l'écrire dans un module provoque une erreur de syntaxe. Pour libérer une valeur, réaffectez la variable à null.
Vaut-il mieux mettre la propriété à undefined ?
Cela dépend de ce qui lit l'objet ensuite. JSON.stringify() ignore les valeurs à undefined, donc le résultat envoyé au réseau sera identique. En revanche la clé reste visible dans Object.keys() et pour l'opérateur in : si votre code teste la présence d'un champ, seul delete donne le résultat attendu.