Apakah ada perbedaan mendasar dalam melakukan keduanya?
delete a.x;
vs.
a.x = undefined;
dimana
a = {
x: 'boo'
};
dapatkah dikatakan bahwa mereka setara?
(Saya tidak mempertimbangkan hal-hal akun seperti "V8 suka tidak menggunakan yang delete
lebih baik" )
javascript
bevacqua
sumber
sumber
undefined
sebagai nilai, yang masih ..Jawaban:
Mereka tidak setara. Perbedaan utama adalah pengaturan itu
berarti bahwa
a.hasOwnProperty("x")
masih akan mengembalikan true, dan oleh karena itu, itu masih akan muncul dalam satufor in
lingkaran, dan dalamObject.keys()
berarti
a.hasOwnProperty("x")
akan mengembalikan falseCara mereka sama adalah bahwa Anda tidak dapat mengetahui apakah suatu properti ada dengan pengujian
Yang seharusnya tidak Anda lakukan jika Anda mencoba menentukan apakah suatu properti ada, harus selalu Anda gunakan
Mengikuti rantai prototipe (disebutkan oleh zzzzBov ) Memanggil
delete
akan memungkinkannya untuk naik ke rantai prototipe, sedangkan pengaturan nilai ke undefined tidak akan mencari properti dalam prototipe dirantai http://jsfiddle.net/NEEw4/1/Menghapus Properti yang Diwarisi Jika properti yang Anda coba hapus diwariskan,
delete
tidak akan memengaruhinya. Artinya,delete
hanya menghapus properti dari objek itu sendiri, bukan properti yang diwarisi.Oleh karena itu, jika Anda perlu memastikan nilai objek tidak terdefinisi,
delete
tidak akan berfungsi ketika properti diwarisi, Anda harus mengatur (menimpanya) keundefined
dalam kasus itu. Kecuali jika tempat yang memeriksa akan digunakanhasOwnProperty
, tetapi kemungkinan tidak akan aman untuk mengasumsikan bahwa di mana pun yang memeriksa akan digunakanhasOwnProperty
sumber
"x" in a
juga akan kembalitrue
dengan yang pertama, danfalse
yang kedua. Output dariObject.keys
juga akan berbeda.undefined
, Anda mungkin juga hanya memeriksaif (a.x)
, kecuali jika itu untuk angka dan 0 validUntuk memparafrasekan pertanyaan:
Tidak.
Yang pertama menghapus kunci dari variabel, yang kemudian menetapkan kunci dengan nilai
undefined
. Ini membuat perbedaan ketika iterasi properti, dan kapanhasOwnProperty
digunakan.Selain itu, ini akan membuat perbedaan yang signifikan ketika rantai prototipe terlibat.
sumber
delete
membiarkannya naik rantai prototipeJika
a.x
fungsi setter,a.x = undefined
akan memanggil fungsi sedangkandelete a.x
tidak akan memanggil fungsi.sumber
Ya ada perbedaan. Jika Anda menggunakan
delete a.x
x bukan lagi properti dari, tetapi jika Anda menggunakannyaa.x=undefined
adalah properti tetapi nilainya tidak terdefinisi.sumber
Nama-nama itu agak membingungkan.
a.x = undefined
tetapkan saja properti ituundefined
, tetapi properti itu masih ada di sana:delete
sebenarnya menghapusnya:sumber
REPL dari node ini harus menggambarkan perbedaannya.
sumber
Saya yakin Anda dapat melihat perbedaan antara
var o1 = {p:undefined};
danvar o2 = {};
.Dalam kedua kasus,
o.p
akanundefined
tetapi dalam kasus pertama, itu karena itulah nilainya dan dalam kasus kedua karena tidak ada nilai .delete
adalah operator yang memungkinkan Anda dapatkan dario1
(atau benda lain yang memiliki nilai yang diberikan untuk nyap
properti) untuko2
cara itu:delete o1.p;
.Operasi sebaliknya dibuat dengan hanya memberikan nilai (
undefined
dalam contoh ini tetapi bisa jadi sesuatu yang lain) ke propertio1.p = undefined;
.Jadi tidak , mereka tidak setara.
delete o.p;
akanmenghapus properti
p
dari objek jika adajangan lakukan yang sebaliknya
o.p = undefined;
akantambahkan properti
p
ke objek jika belum memilikinya dan tetapkan nilainyaundefined
cukup ubah nilai properti jika objek sudah memilikinya
Dari perspektif kinerja,
delete
itu buruk karena memodifikasi struktur objek (seperti menambahkan properti baru jika Anda belum menginisialisasi dalam konstruktor).Padahal pengaturan nilai untuk
undefined
melepaskan konten juga tetapi tanpa memaksa untuk memodifikasi struktur.sumber
Objek hanyalah sebuah representasi pohon, yang berarti, dalam memori root menunjuk ke berbagai lokasi memori di mana kunci objek itu disimpan. dan lokasi itu menunjuk ke lokasi lain di mana nilai aktual kunci itu disimpan, atau lokasi di mana kunci anak disimpan atau lokasi tempat nilai array disimpan.
Ketika Anda menghapus kunci apa pun dari suatu objek menggunakan delete, sebenarnya itu menghapus tautan antara kunci itu dan objek induknya dan lokasi memori kunci dan nilainya dibebaskan untuk menyimpan informasi lain.
Ketika Anda mencoba untuk menghapus kunci apa pun dengan menetapkan nilai yang tidak ditentukan, maka Anda hanya mengatur nilainya, bukan menghapus kunci itu. Itu berarti bahwa lokasi kunci memori masih terhubung dengan objek induknya dan nilainya jika kunci tidak ditentukan.
Menggunakan undefined alih-alih menggunakan delete keyword adalah praktik yang buruk, karena tidak melepaskan lokasi memori dari kunci itu.
Bahkan jika kunci tidak ada, dan Anda menetapkannya sebagai tidak terdefinisi, maka kunci itu akan dibuat dengan nilai
undefined
.misalnya
hapus tidak dapat dikerjakan dengan properti yang diwarisi karena properti itu bukan bagian dari objek anak itu.
sumber
as a general rule of thumb, using 'delete' makes thing slower.
dan developers.google.com/v8/designTo reduce the time required to access JavaScript properties, V8 does not use dynamic lookup to access properties. Instead, V8 dynamically creates hidden classes behind the scenes. In V8, an object changes its hidden class when a new property is added.
, dan akhirnya smashingmagazine.com/2012/11/…Menggunakan array, alih-alih objek, saya bisa menampilkan bahwa menghapus menggunakan memori tumpukan lebih sedikit dari yang tidak ditentukan.
Misalnya, kode ini tidak akan selesai:
Ini menghasilkan kesalahan ini:
Jadi, seperti yang Anda lihat
undefined
sebenarnya membutuhkan memori tumpukan.Namun, jika Anda juga
delete
item-ary (alih-alih hanya mengaturnyaundefined
), kode perlahan-lahan akan selesai:Ini adalah contoh ekstrem, tetapi mereka menekankan
delete
bahwa saya belum pernah melihat siapa pun menyebutkan di mana pun.sumber