Saya agak bingung dengan delete
operator JavaScript . Ambil bagian kode berikut:
var obj = {
helloText: "Hello World!"
};
var foo = obj;
delete obj;
Setelah potongan kode ini dieksekusi, obj
adalah null
, tetapi foo
masih mengacu pada objek persis seperti obj
. Saya menduga objek ini adalah objek yang sama dengan yang foo
ditunjukkan.
Ini membingungkan saya, karena saya berharap tulisan itu delete obj
menghapus objek yang obj
menunjuk ke dalam memori — bukan hanya variabel obj
.
Apakah ini karena JavaScript's Garbage Collector bekerja dengan basis retain / release, sehingga jika saya tidak memiliki variabel lain yang menunjuk ke objek, itu akan dihapus dari memori?
(Omong-omong, pengujian saya dilakukan di Safari 4.)
javascript
pointers
object
memory-management
garbage-collection
Steve Harrison
sumber
sumber
var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
tidak dihapus periksaobj
hapus penggunaan:delete obj.helloText
dan kemudian centangfoo now foo is an empty object
delete
bukan untuk menghapus objek dalam javascript.delete
Digunakan untuk menghapus kunci objek. Dalam kasus Andavar obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
, objek tidak dihapus. Centangobj
. Selanjutnya, jalankandelete obj.helloText
dan Anda dapat melihat bahwafoo
sekarang menunjuk ke kosong objek. "" "Jawaban:
Operator hapus hanya menghapus referensi, tidak pernah menjadi objek itu sendiri. Jika itu menghapus objek itu sendiri, referensi lain yang tersisa akan menggantung, seperti penghapusan C ++. (Dan mengakses salah satunya akan menyebabkan crash. Untuk membuat semuanya menjadi nol berarti memiliki kerja ekstra saat menghapus atau memori tambahan untuk setiap objek.)
Karena Javascript adalah sampah yang dikumpulkan, Anda tidak perlu menghapus objek sendiri - mereka akan dihapus ketika tidak ada cara untuk merujuknya lagi.
Mungkin bermanfaat untuk menghapus referensi ke suatu objek jika Anda selesai dengan itu, karena ini memberi informasi lebih lanjut kepada pengumpul sampah tentang apa yang dapat direklamasi. Jika referensi tetap ke objek besar, ini dapat menyebabkannya tidak direklamasi - bahkan jika program Anda tidak benar-benar menggunakan objek itu.
sumber
delete
kunci hanya berfungsi untuk properti objek, bukan variabel. perfectionkills.com/understanding-deletevar obj = {a: {}}; delete obj.a;
window
?var
)The
delete
perintah tidak berpengaruh pada variabel biasa, hanya sifat. Setelahdelete
perintah, properti tidak memiliki nilainull
, itu tidak ada sama sekali.Jika properti adalah referensi objek,
delete
perintah menghapus properti tetapi bukan objek. Pengumpul sampah akan merawat objek jika tidak memiliki referensi lain untuk itu.Contoh:
(Diuji di Firefox.)
sumber
x
variabel Anda menjadi hanya properti padawindow
objek global , dandelete x;
benar-benar menghapusx
variabel sama sekali.x
tidak akan menjadi variabel yang tepat di beberapa browser, tetapi properti diwindow
objek. Ini tentu saja masalah dengan konsol, dan tidak mencerminkan bagaimana kode biasanya dieksekusi."variabel yang dideklarasikan secara implisit" adalah properti dari objek global, jadi hapus karya pada mereka seperti itu bekerja pada properti apa pun. Variabel yang dideklarasikan dengan var tidak bisa dihancurkan.
sumber
let
.Berasal dari Dokumentasi Mozilla, "Anda dapat menggunakan operator hapus untuk menghapus variabel yang dideklarasikan secara implisit tetapi tidak yang dideklarasikan dengan pernyataan var."
Inilah tautannya: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Operators:Special_Operators:delete_Operator
sumber
delete
tidak digunakan untuk menghapus objek dalam java Script.delete
digunakan untuk menghapusobject key
dalam kasus Andaobjek tidak dihapus periksa obj masih menggunakan nilai yang sama dengan menghapus penggunaan:
dan kemudian periksa
obj, foo
, keduanya adalah objek kosong.sumber
Baru saja menemukan jsperf yang mungkin Anda anggap menarik mengingat masalah ini. (Mungkin berguna untuk menyimpannya di sekitar untuk melengkapi gambar)
Ini membandingkan hapus , pengaturan nol dan pengaturan tidak ditentukan .
Tetapi perlu diingat bahwa itu menguji kasus ketika Anda menghapus / mengatur properti berkali-kali.
sumber
Selain dari pertanyaan GC, untuk kinerja orang harus mempertimbangkan optimisasi yang mungkin dilakukan browser di latar belakang ->
http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efisien-javascript/
Tampaknya lebih baik membatalkan referensi daripada menghapusnya karena itu dapat mengubah 'kelas' yang digunakan Chrome di belakang layar.
sumber
IE 5 hingga 8 memiliki bug di mana menggunakan delete pada properti dari objek host (Window, Global, DOM dll) melempar TypeError "objek tidak mendukung tindakan ini".
Nanti jika Anda perlu memeriksa di mana properti tersebut memiliki makna nilai penuh digunakan
el.foo !== undefined
karena"foo" in el
akan selalu mengembalikan true di IE.Jika Anda benar-benar membutuhkan properti untuk benar-benar menghilang ...
jika Anda perlu menggunakan objek host dengan host api ...
sumber
Saya menemukan artikel ini dalam pencarian saya untuk jawaban yang sama. Apa yang akhirnya saya lakukan hanyalah memunculkan
obj.pop()
semua nilai / objek yang tersimpan di objek saya sehingga saya bisa menggunakan kembali objek tersebut. Tidak yakin apakah ini praktik yang buruk atau tidak. Teknik ini berguna bagi saya untuk menguji kode saya di alat Chrome Dev atau FireFox Web Console.sumber
Ini bekerja untuk saya, meskipun ini bukan praktik yang baik. Itu hanya menghapus semua elemen terkait dengan objek yang dimiliki.
sumber
Mengatur variabel untuk
null
memastikan untuk memecah referensi ke objek di semua browser termasuk referensi melingkar yang dibuat antara elemen DOM dan cakupan Javascript. Dengan menggunakandelete
perintah, kami menandai objek yang akan dihapus pada proses berikutnya dari pengumpulan Sampah, tetapi jika ada beberapa variabel yang merujuk objek yang sama, menghapus variabel tunggal TIDAK AKAN membebaskan objek, itu hanya akan menghapus hubungan antara variabel itu dan objek. Dan pada pengumpulan sampah berikutnya, hanya variabel yang akan dibersihkan.sumber