Hapus operator tidak berfungsi javascript

Tujuannya adalah untuk menghapus versi lokal a from scope sehingga kami dapat menetapkan kembali versi global a menjadi "fish". Apakah ini akan berhasil?

  • a) ikan, ikan (sukses)
  • b) ikan, kucing (gagal)
  • c) kombinasi yang berbeda
  • d) tergantung pada browser (selalu merupakan opsi yang bagus jika Anda menebak-nebak)
  • e) tergantung pada konteks eksekusi

Jawaban dalam kasus khusus ini adalah b, jawaban untuk pertanyaan yang lebih umum tentang hal semacam ini adalah e (kita akan kembali lagi nanti). Itu tidak berhasil. Nilai versi global a tidak berubah. Ini menunjukkan poin mendasar tentang operator hapus. Anda tidak dapat menghapus apa pun yang dideklarasikan dengan var

Ini berlaku bahkan untuk variabel yang Anda deklarasikan di dalam fungsi; . Ingatlah ini jika Anda ingin menghapus sesuatu dari ruang lingkup menggunakan operator hapus, karena itu tidak akan berhasil. Kami dapat memperbaiki kode dengan menetapkan ulang secara eksplisit versi global daripada menggunakan hapus

var a = "cat";
(function() {
var a = "dog";
this.a = "fish";
console.log(a); // prints "dog"
})();
console.log(a); // prints "fish"

Jadi, apa yang terjadi dengan operator hapus?

Hal pertama yang pertama

Operator hapus mengembalikan nilai boolean. Kami dapat menggunakan ini untuk mendapatkan pemahaman yang lebih baik tentang cara kerjanya (dan tidak berfungsi). Namun ada satu gotcha dengan nilai pengembalian - apakah itu benar atau salah tergantung pada apakah objek itu ada setelahnya, bukan apakah penghapusan berhasil

Ini perbedaan yang halus, tetapi itu berarti bahwa penghapusan akan mengembalikan nilai true jika Anda mencoba menghapus sesuatu yang tidak pernah ada sejak awal. Anda mungkin tidak mengharapkan itu. Saya tidak

var a = "you can't delete me!";
console.log(delete a); // prints false c
onsole.log(delete octopus); // prints true!
_

Menghapus dalam lingkup global

Semua yang Anda deklarasikan dalam lingkup global, dengan atau tanpa kata kunci var (yang membuat variabel baru dalam lingkup lokal), juga menjadi properti dari objek global

var a = "apples";
b = "oranges";
console.log(window.a); // prints "apples"
console.log(window.b); // prints "oranges"

Perlu disebutkan pada titik ini bahwa mendeklarasikan variabel tanpa kata kunci var adalah ilegal di ECMAScript dan akan menimbulkan kesalahan jika Anda mencoba melakukannya dalam mode ketat. Ini adalah hal yang baik karena mendeklarasikan variabel tanpa menggunakan var sering menunjukkan bahwa pemrogram salah mengetik nama variabel yang ada. Mode ketat membuat kesalahan semacam ini gagal dengan cepat. Sayangnya mode ketat tidak banyak digunakan, jadi untuk saat ini kita harus berpura-pura tidak ada
Kembali ke contoh, mari kita lihat apa yang terjadi jika kita mencoba menghapus a dan b

var a = "apples";
b = "oranges";
console.log(delete a); // prints false
console.log(delete b); // prints true
console.log(window.a); // prints "apples"
console.log(window.b); // prints undefined

Karena dideklarasikan dengan var, variabel a adalah objek di ruang global dan tidak akan pernah bisa dihapus. Namun variabel b dideklarasikan menggunakan singkatan licik untuk membuat properti pada objek global, dan properti dapat dihapus. Sebenarnya ini adalah tujuan utama dari operator hapus. Operator hapus adalah untuk menghapus properti, bukan objek

Sejauh ini bagus

Menghapus dalam lingkup fungsi

Kabar baiknya adalah bahwa hapus dalam lingkup fungsi bekerja dengan cara yang sama seperti dalam lingkup global. Namun itu memberikan demonstrasi yang baik dari poin di atas, yaitu gagal menggunakan kata kunci var menyebabkan banyak hal bocor ke lingkup global

(function() {
var a = "apples";
b = "oranges";
console.log(window.a); // prints undefined
console.log(window.b); // prints "oranges"
console.log(delete a); // prints false
console.log(delete b); // prints true
console.log(window.a); // prints undefined
console.log(window.b); // prints undefined console.log(a); // prints "apples"
console.log(b); // Error: b is not defined
})();
_

Contoh menunjukkan bahwa variabel lokal a yang diinisialisasi dengan benar dengan var tidak akan pernah bisa dihapus, tetapi b (yang sebenarnya adalah jendela. b) dapat dihapus

Menghapus dalam lingkup eval

Di awal artikel ini saya mengklaim bahwa jawaban untuk teka-teki awal bergantung pada "konteks eksekusi". JavaScript memiliki tiga konteks eksekusi, dan kabar baiknya adalah kita telah membahas dua di antaranya

  1. Kode global
  2. Kode fungsi
  3. Kode evaluasi

Berita buruknya adalah bahwa kasus ketiga menyebabkan operator hapus berperilaku berbeda dari apa yang telah kita lihat sejauh ini. Berita buruknya adalah hal itu menyebabkan kami membuang apa yang selama ini menjadi aturan emas – Anda tidak dapat menghapus apa pun yang dibuat dengan kata kunci var

eval('var a = "cat";' +
'console.log(window.a);' + // prints "cat"
'console.log(delete a);' + // prints true (?!)
'console.log(window.a);' + // prints undefined
'console.log(a);'); // Error: a is not defined

Dalam hal ini kita mendeklarasikan var a dan melihat bahwa a telah menemukan jalannya ke objek window, yang merupakan perilaku umum yang menyiratkan bahwa kita berada dalam lingkup global. Namun hal-hal kemudian berubah ketika kami menemukan bahwa di dalam pernyataan eval dimungkinkan untuk menghapus a

Anda mungkin berpikir "siapa peduli, saya tidak pernah menggunakan eval", tetapi ingatlah bahwa alat pengembang browser seperti Firefox Scratchpad berfungsi dengan memasukkan kode apa pun yang Anda masukkan ke dalam pernyataan eval. Itulah mengapa Anda mungkin belum pernah menemukan beberapa perilaku di artikel ini sebelumnya, dan mengapa Anda tidak dapat mengujinya menggunakan alat browser. Anda harus benar-benar membuat halaman HTML dengan skrip jika Anda ingin melihat cara kerja penghapusan yang sebenarnya

Beberapa hal lain yang tidak dapat Anda hapus

Beberapa objek dan properti secara khusus ditandai dengan properti yang menunjukkan bahwa mereka tidak dapat dihapus, seperti properti length dari array dan fungsi atau objek window

console.log(delete window); // prints false
console.log(delete undefined); // prints false
console.log(delete [].length); // prints false
console.log(delete function() {}.length); // prints false
_

Pembatasan ini dirancang untuk menghentikan Anda dari kekacauan. Ini adalah kejutan menyenangkan yang datang dari bahasa yang memungkinkan Anda mendefinisikan ulang undefined

Cara yang tepat agar hal-hal ini menjadi tidak dapat dihapus terkait dengan fitur JavaScript yang disebut "atribut properti", yang mungkin menjadi subjek blog masa depan dalam seri ini

Poin terakhir

Kami sekarang tahu bahwa Anda tidak dapat menghapus apa pun yang dideklarasikan dengan var kecuali Anda sedang dalam eksekusi eval. Mengingat bahwa kita juga tahu bahwa mendeklarasikan variabel tanpa var adalah ilegal, dan kita juga tahu dari berbagai posting blog bahwa menggunakan eval pada umumnya adalah ide yang buruk, kita dapat sampai pada kesimpulan yang sedikit mengejutkan. Anda tidak akan pernah bisa menghapus objek di JavaScript

Jika itu terdengar seperti kebocoran memori yang menunggu untuk terjadi maka jangan khawatir, seharusnya tidak demikian. Objek yang dideklarasikan dalam fungsi akan memenuhi syarat untuk pengumpulan sampah saat berada di luar cakupan, dan Anda harus menghindari pencemaran ruang nama global dengan objek sejak awal. Ini juga tidak benar-benar berarti bahwa menghapus tidak berguna - ini dirancang untuk menghapus properti daripada objek, dan untuk itulah Anda harus menggunakannya

Bagaimana cara menggunakan operator hapus di JavaScript?

Operator hapus menghapus properti dari objek. .
Jika properti yang Anda coba hapus tidak ada, hapus tidak akan berpengaruh dan akan mengembalikan nilai true
hapus hanya berpengaruh pada properti sendiri. .
Properti yang tidak dapat dikonfigurasi tidak dapat dihapus

Mengapa Anda tidak boleh menggunakan hapus JavaScript?

ini hanya efektif pada properti objek, tidak berpengaruh pada nama variabel atau fungsi. Operator hapus tidak boleh digunakan pada properti objek JavaScript yang telah ditentukan sebelumnya seperti objek window , Math , dan Date. Aplikasi Anda dapat crash .

Bagaimana cara menghapus seluruh objek dalam JavaScript?

Anda cukup menetapkan. x = null; jika ingin menghapus nilainya.

Bagaimana cara menghapus kunci objek dalam JavaScript?

Kita dapat menghapus Properti dari Objek JavaScript menggunakan Operator hapus, Penghancuran Objek, dan Refleksi. deleteProperty() metode . Operator hapus dan Reflect. metode deleteProperty() menghapus properti yang ditentukan dari objek aslinya.