Détails
Comment supprimer une propriété d'un objet JavaScript ?
Disons que je crée un objet comme suit :
var myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
Quelle est la meilleure façon de supprimer la propriété regex
pour obtenir le nouvel myObject
suivant ?
var myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
5780
3
Comme ça :
Démonstration
Pour tous ceux qui souhaitent en savoir plus, l'utilisateur de Stack Overflow [kangax][1] a rédigé un billet incroyablement détaillé sur l'instruction
delete
sur son blog, [Understanding delete][2]. Nous vous le recommandons vivement.[1] : https://stackoverflow.com/users/130652/kangax [2] : http://perfectionkills.com/understanding-delete/
Cela fonctionne dans Firefox et Internet Explorer, et je pense que cela fonctionne dans tous les autres.
Mise à jour 2018-07-21: Pendant longtemps, je me suis senti gêné par cette réponse, alors je pense qu'il est temps que je la retouche un peu. Juste un petit commentaire, une clarification et un formatage pour aider à accélérer la lecture des parties inutilement longues et alambiquées de cette réponse.
# LA VERSION COURTE # La réponse réelle à la question Comme d'autres l'ont dit, vous pouvez utiliser `delete`.
Équivalent d'un tableau
N'utilisez pas
delete
dans un tableau. Utilisez plutôtArray.prototype.splice
.# LA VERSION LONGUE JavaScript est un langage OOP, donc tout est un objet, y compris *arrays*. Ainsi, je pense qu'il est nécessaire de souligner une mise en garde particulière. Dans les tableaux, contrairement aux objets ordinaires, l'utilisation de `delete` laisse derrière elle des déchets sous la forme de `null`, créant un "trou" dans le tableau.
Comme vous pouvez le voir,
delete
ne fonctionne pas toujours comme on pourrait s'y attendre. La valeur est écrasée, mais la mémoire n'est pas réallouée. En d'autres termes,array[4]
n'est pas relocalisé dansarray[3]
. Contrairement àArray.prototype.unshift
, qui insère un élément au début du tableau et décale tout vers le haut (array[0]
devientarray[1]
, etc.). Honnêtement, à part le fait de mettre ànull
plutôt qu'àundefined
- ce qui est légitimement bizarre - ce comportement ne devrait pas être surprenant, puisquedelete
est un opérateur unaire, commetypeof
, qui est ancré dans le langage et qui n'est pas censé se soucier du type d'objet sur lequel il est utilisé, alors queArray
est une sous-classe deObject
avec des méthodes spécifiquement conçues pour travailler avec des tableaux. Il n'y a donc aucune raison pour quedelete
ait un cas spécial pour déplacer le tableau, car cela ne ferait que ralentir les choses avec un travail inutile. Rétrospectivement, mes attentes étaient irréalistes. Bien sûr, cela m'a surpris. Parce que j'ai écrit ceci pour justifier ma croisade contre les "null garbage" :Et juste comme ça, vous avez fait plaisir à Mr. PDP-11. Hourra ! (Je le gronderais quand même...)
Array.prototype.splice vs Array.prototype.slice
Il me semble important de souligner la différence entre ces deux fonctions au nom similaire, car elles sont toutes deux très utiles.
Array.prototype.splice(start, n)
.splice()
mute le tableau, et retourne les indices retirés. Le tableau est découpé à partir de l'indicestart
, etn
éléments sont découpés. Si n n'est pas spécifié, le tableau entier aprèsstart
est découpé (n = array.length - start
).Array.prototype.slice(start, end)
.slice()
est non-destructif et retourne un nouveau tableau contenant les indices indiqués destart
àend
. Siend
n'est pas spécifié, le comportement est le même que celui de.splice()
(end = array.length
). Le comportement est un peu délicat car, pour une raison quelconque,end
indexe à partir de 1 au lieu de 0. Je ne sais pas pourquoi il fait ça, mais c'est comme ça. Aussi, si `end