Opérateur de delete
est lent de façon inattendue!
Regardez l' indice de référence.
Supprimer est le seul vrai moyen de supprimer les propriétés de l'objet, sans restes, mais il fonctionne ~ 100 fois plus lent,
par rapport à "l'alternative", object[key] = undefined
.
Cette solution n'est pas la bonne réponse à cette question! Mais, si vous l'utilisez avec soin, vous pouvez accélérer considérablement certains algorithmes. Si vous utilisez delete
dans les boucles et vous avez des problèmes avec la performance, de lire l'explication détaillé.
Quand doit-on utiliser delete
et lorsque la valeur définie à l' undefined
?
Un objet est une paire clé-valeur. Ce que j'appelle une "valeur" est une primitive ou une référence à un autre objet, connecté à la "clé".
Utiliser delete
, lorsque vous êtes de passage de l'objet de résultat pour le code sur lequel vous n'avez pas le contrôle (ou lorsque vous n'êtes pas sûr de votre équipe ou vous-même).
Il supprime la clé de la table de hachage.
var obj = {
field: 1
};
delete obj.field;
Utilisez le réglage d' undefined
, quand vous vous souciez de la performance. Il peut donner un sérieux coup de pouce à votre code.
La clé reste sur sa place dans la table de hachage, seule la valeur est remplacé par undefined
. Comprendre, c' for..in
boucle sera toujours effectuer une itération sur cette touche.
var obj = {
field: 1
};
obj.field = undefined;
En utilisant cette méthode, pas tous les moyens de détermination de l'existence de la propriété fonctionnent comme prévu.
Toutefois, ce code:
object.field === undefined
va se comporter de manière équivalente pour les deux méthodes.
Tests
Pour résumer, les différences sont toutes des façons de déterminer l'existence de la propriété, et à propos de for..in
boucle.
console.log('* -> "Takes prototype inheritance into consideration, that means it lookups all over prototype chain too."');
console.log(obj.field === undefined, 'obj.field === undefined', 'You get "undefined" value when querying for "field" in object-hashmap. *');
console.log(obj["field"] === undefined, 'obj["field"] === undefined', 'Just another way to query (equivalent). *');
console.log(typeof obj.field === "undefined", 'typeof obj.field === "undefined"', 'Get the value attached to "field" key, and check it\'s type is "undefined". *');
console.log(! ("field" in obj), '! ("field" in obj)', 'This statement returns true if "field" key exists in the hashmap. False otherwise. *');
console.log(obj.hasOwnProperty("field"), 'obj.hasOwnProperty("field")', 'This statement returns true if 'field' key exists in the hashmap. The ONLY way NOT to lookup for property in the prototype chain!');
//Object.keys().indexOf() is an overkill :)
var counter = 0,
key;
for (key in obj) {
counter++;
}
console.assert(counter === 0, 'counter === 0', '"field" is not iterated using "for .. in" loop. *');