Dengan JavaScript Array, saya dapat mengatur ulang ke keadaan kosong dengan satu tugas:
array.length = 0;
Ini membuat Array "tampak" kosong dan siap untuk digunakan kembali, dan sejauh yang saya mengerti adalah satu "operasi" - yaitu, waktu yang konstan.
Apakah ada cara serupa untuk menghapus Objek JS? Saya tahu saya bisa mengulangi bidangnya dengan menghapusnya:
for (var prop in obj) { if (obj.hasOwnProperty(prop)) { delete obj[prop]; } }
tetapi ini memiliki kompleksitas linier.
Saya juga bisa membuang objek dan membuat yang baru:
obj = {};
Tapi penciptaan "barang bebas" yang baru menyebabkan masalah dengan Pengumpulan Sampah di IE6. ( Seperti dijelaskan di sini )
javascript
performance
Levik
sumber
sumber
for (var prop in obj)
Jawaban:
Jawaban singkat untuk pertanyaan Anda, saya pikir, adalah tidak (Anda bisa membuat objek baru).
Dalam contoh ini, saya yakin pengaturan panjang ke 0 masih menyisakan semua elemen untuk pengumpulan sampah.
Anda bisa menambahkan ini ke Object.prototype jika itu adalah sesuatu yang sering Anda gunakan. Ya itu linear dalam kompleksitas, tetapi apa pun yang tidak melakukan pengumpulan sampah nantinya akan menjadi.
Ini solusi terbaik. Saya tahu ini tidak terkait dengan pertanyaan Anda - tetapi untuk berapa lama kami perlu terus mendukung IE6? Ada banyak kampanye untuk menghentikan penggunaannya.
Jangan ragu untuk mengoreksi saya jika ada sesuatu yang salah di atas.
sumber
Nah, dengan risiko membuat semuanya terlalu mudah ...
... tampaknya cukup efektif dalam membersihkan objek dalam satu baris kode dengan tanda kurung minimum. Semua anggota akan benar-benar dihapus alih-alih dibiarkan sebagai sampah.
Tentunya jika Anda ingin menghapus objek itu sendiri, Anda masih harus melakukan delete () terpisah untuk itu.
sumber
hasOwnProperty
dalam loop ini. Saya sudah membaca dokumen, tetapi saya masih mencoba untuk membungkus kepala saya di sekitar apa, jika ada, risiko apakah kita menghilangkanhasOwnProperty()
cek?ES5
Solusi ES5 dapat:
ES6
Dan solusi ES6 dapat:
Performa
Terlepas dari spesifikasi, solusi tercepat umumnya adalah:
Alasan mengapa
for..in
harus dilakukan hanya pada objek yang dangkal atau polos adalah karena ia melintasi properti yang diwariskan secara prototipe, bukan hanya properti yang dapat dihapus. Dalam hal itu tidak diketahui pasti bahwa suatu objek polos dan sifat-sifatnya dapat dihitung,for
denganObject.getOwnPropertyNames
adalah pilihan yang lebih baik.sumber
Anda bisa mencoba ini. Fungsi di bawah ini mengatur semua nilai properti objek menjadi tidak terdefinisi. Bekerja juga dengan objek bersarang.
sumber
Jadi, rekap pertanyaan Anda: Anda ingin menghindari, sebanyak mungkin, masalah dengan bug IE6 GC. Bug itu memiliki dua penyebab:
Solusi untuk menyebabkan 1 tampaknya: menjaga jumlah alokasi tetap rendah; menetapkan objek dan string baru sesedikit mungkin.
Solusi untuk menyebabkan 2 tampaknya: menjaga jumlah objek 'hidup'; hapus string dan objek Anda segera setelah Anda tidak membutuhkannya lagi, dan buat kembali jika diperlukan.
Sampai batas tertentu, solusi ini kontradiktif: untuk menjaga jumlah objek dalam memori rendah akan memerlukan lebih banyak alokasi dan de-alokasi. Sebaliknya, terus-menerus menggunakan kembali objek yang sama bisa berarti menyimpan lebih banyak objek dalam memori daripada yang diperlukan.
Sekarang untuk pertanyaan Anda. Apakah Anda akan mereset objek dengan membuat yang baru, atau dengan menghapus semua propertinya: itu akan tergantung pada apa yang ingin Anda lakukan dengannya setelah itu.
Anda mungkin ingin menetapkan properti baru untuk itu:
Tidak ada cara cepat dan mudah digunakan untuk menghapus objek JScript untuk digunakan kembali seolah-olah itu adalah objek baru - tanpa membuat yang baru. Yang berarti jawaban singkat untuk pertanyaan Anda adalah 'Tidak', seperti kata jthompson.
sumber
Sesuatu yang baru untuk dipikirkan tentang menantikan Object.observe di ES7 dan dengan pengikatan data secara umum. Mempertimbangkan:
Jadi di bawah keadaan itu # 2 bisa menjadi pilihan terbaik.
sumber
obj = {}
akan membuat kerangka kerja tidak mengetahui adanya perubahan lebih lanjut ke objek sehingga template Anda tidak akan mendapatkan rendering yang benar. Namun, Opsi # 2 akan berfungsi dengan baik.Anda dapat menghapus alat peraga, tetapi jangan menghapus variabel.
delete abc;
tidak valid dalam ES5 (dan melempar dengan menggunakan yang ketat).Anda dapat menetapkannya ke nol untuk mengaturnya agar dihapus ke GC (tidak akan jika Anda memiliki referensi lain ke properti)
Mengatur
length
properti pada objek tidak mengubah apa pun. (hanya, yah, mengatur properti)sumber
length
ke 0 pada array (yang merupakan jenis objek tertentu - jika Anda tidak percaya, coba jalankantypeof []
), itu tidak hanya akan menyetel properti, itu sebenarnya akan menghapus konten array . Lihat stackoverflow.com/questions/1232040/…window.abc
karena itu adalah alat untuk kasus itu.Ini menyadap saya selama berabad-abad, jadi ini adalah versi saya karena saya tidak ingin objek kosong, saya ingin satu dengan semua properti tetapi mengatur ulang ke beberapa nilai default. Agak seperti contoh baru dari kelas.
sumber