Mereka tidak setara. Perbedaan utama adalah pengaturan itu
a.x = undefined
berarti bahwa a.hasOwnProperty("x")masih akan mengembalikan true, dan oleh karena itu, itu masih akan muncul dalam satu for inlingkaran, dan dalamObject.keys()
delete a.x
berarti a.hasOwnProperty("x")akan mengembalikan false
Cara mereka sama adalah bahwa Anda tidak dapat mengetahui apakah suatu properti ada dengan pengujian
if (a.x === undefined)
Yang seharusnya tidak Anda lakukan jika Anda mencoba menentukan apakah suatu properti ada, harus selalu Anda gunakan
// If you want inherited properties
if ('x' in a)
// If you don't want inherited properties
if (a.hasOwnProperty('x'))
Mengikuti rantai prototipe (disebutkan oleh zzzzBov ) Memanggil deleteakan memungkinkannya untuk naik ke rantai prototipe, sedangkan pengaturan nilai ke undefined tidak akan mencari properti dalam prototipe dirantai 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
Menghapus Properti yang Diwarisi Jika properti yang Anda coba hapus diwariskan, deletetidak akan memengaruhinya. Artinya, deletehanya menghapus properti dari objek itu sendiri, bukan properti yang diwarisi.
var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
delete extended.x;
console.log(extended.x); // Still fromPrototype
Oleh karena itu, jika Anda perlu memastikan nilai objek tidak terdefinisi, deletetidak akan berfungsi ketika properti diwarisi, Anda harus mengatur (menimpanya) ke undefineddalam kasus itu. Kecuali jika tempat yang memeriksa akan digunakan hasOwnProperty, tetapi kemungkinan tidak akan aman untuk mengasumsikan bahwa di mana pun yang memeriksa akan digunakanhasOwnProperty