Ils ne sont pas équivalents. La principale différence est que le réglage
a.x = undefined
signifie que a.hasOwnProperty("x")cela retournera toujours vrai, et par conséquent, il apparaîtra toujours dans une for inboucle, et dansObject.keys()
delete a.x
signifie que a.hasOwnProperty("x")cela retournera faux
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 devez 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 de prototypes (mentionnée par zzzzBov ) L'appel lui deletepermettra de remonter la chaîne de prototypes, alors que définir la valeur sur undefined ne cherchera pas 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, deletene l'affectera pas. Autrement dit, deletesupprime uniquement 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 ne sera pas définie, deletene fonctionnera pas lorsque la propriété sera héritée, vous devrez la définir (la remplacer) undefineddans ce cas. À moins que l'endroit qui le vérifie ne l'utilisera hasOwnProperty, mais il ne serait probablement pas prudent de supposer que partout où il vérifierahasOwnProperty