Ils ne sont pas équivalents. La principale différence est que le réglage
a.x = undefined
signifie que a.hasOwnProperty("x")
retournera toujours vrai, et par conséquent, il apparaîtra toujours dans un fichier for in
et dans Object.keys()
delete a.x
signifie que a.hasOwnProperty("x")
retournera false
La façon dont ils sont identiques est que vous ne pouvez pas dire si une propriété existe en testant
if (a.x === undefined)
Ce que vous ne devriez pas faire si vous essayez de déterminer si une propriété existe, vous devriez toujours utiliser
// If you want inherited properties
if ('x' in a)
// If you don't want inherited properties
if (a.hasOwnProperty('x'))
Suivre la chaîne des prototypes (mentionné par zzzzBov ) Appel delete
lui permettra de remonter la chaîne des prototypes, tandis que la valeur indéfinie ne permettra pas de rechercher la propriété dans les prototypes enchaînés. http://jsfiddle.net/NEEw4/1/
var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
extended.x = "overriding";
console.log(extended.x); // overriding
extended.x = undefined;
console.log(extended.x); // undefined
delete extended.x;
console.log(extended.x); // fromPrototype
Suppression des propriétés héritées Si la propriété que vous essayez de supprimer est héritée, delete
ne l'affectera pas. C'est-à-dire, delete
ne supprime que les propriétés de l'objet lui-même, pas les propriétés héritées.
var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
delete extended.x;
console.log(extended.x); // Still fromPrototype
Par conséquent, si vous devez vous assurer que la valeur d'un objet sera indéfinie, delete
ne fonctionnera pas lorsque la propriété est héritée, vous devrez la définir (remplacer) par undefined
dans ce cas. À moins que l'endroit qui le vérifie utilise hasOwnProperty
mais il n'est pas sûr de supposer que tous ceux qui le vérifient utiliseront la fonction hasOwnProperty