Nie są równoważne. Główną różnicą jest to ustawienie
a.x = undefined
oznacza, że a.hasOwnProperty("x")nadal będzie zwracać wartość true, a zatem nadal będzie pojawiać się w for inpętli i w formacieObject.keys()
delete a.x
oznacza, że a.hasOwnProperty("x")zwróci fałsz
Sposób, w jaki są takie same, polega na tym, że nie można stwierdzić, czy właściwość istnieje, testując
if (a.x === undefined)
Czego nie powinieneś robić, jeśli próbujesz ustalić, czy właściwość istnieje, zawsze powinieneś jej używać
// If you want inherited properties
if ('x' in a)
// If you don't want inherited properties
if (a.hasOwnProperty('x'))
Podążanie za łańcuchem prototypów (wspomnianym przez zzzzBov ) Wywołanie deletepozwoli mu przejść w górę łańcucha prototypów, podczas gdy ustawienie wartości na undefined nie spowoduje wyszukania właściwości w połączonych prototypach 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
Usuwanie odziedziczonych właściwości Jeśli właściwość, którą próbujesz usunąć, jest dziedziczona, deletenie ma na nią wpływu. Oznacza to, deleteże usuwa tylko właściwości z samego obiektu, a nie właściwości dziedziczone.
var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
delete extended.x;
console.log(extended.x); // Still fromPrototype
Dlatego jeśli chcesz się upewnić, że wartość obiektu będzie niezdefiniowana, deletenie zadziała, gdy właściwość zostanie odziedziczona, będziesz musiał undefinedw takim przypadku ustawić (nadpisać) ją na . Chyba że miejsce, które go sprawdza, będzie używać hasOwnProperty, ale prawdopodobnie nie byłoby bezpiecznie założyć, że wszędzie, gdzie sprawdza, będzie używaćhasOwnProperty