The delete
Operator menghilangkan properti dari suatu objek. Itu tidak bisa menghapus variabel. Jadi jawaban untuk pertanyaan tergantung pada bagaimana variabel global atau properti didefinisikan.
(1) Jika itu dibuat dengan var
, itu tidak dapat dihapus.
Sebagai contoh:
var g_a = 1; //create with var, g_a is a variable
delete g_a; //return false
console.log(g_a); //g_a is still 1
(2) Jika itu dibuat tanpa var
, itu bisa dihapus.
g_b = 1; //create without var, g_b is a property
delete g_b; //return true
console.log(g_b); //error, g_b is not defined
Penjelasan Teknis
1. Menggunakan var
Dalam hal ini referensi g_a
dibuat dalam apa yang disebut spesifikasi ECMAScript " VariableEnvironment " yang dilampirkan ke lingkup saat ini - ini mungkin konteks pelaksanaan fungsi dalam kasus menggunakan var
di dalam fungsi (meskipun mungkin sedikit lebih rumit ketika Anda mempertimbangkan let
) atau dalam kasus kode "global", VariableEnvironment dilampirkan ke objek global (sering window
).
Referensi dalam VariableEnvironment biasanya tidak dapat dihapus - proses yang dirinci dalam ECMAScript 10.5 menjelaskan ini secara rinci, tetapi cukup untuk mengatakan bahwa kecuali kode Anda dieksekusi dalam eval
konteks (yang menggunakan sebagian besar konsol pengembangan berbasis browser), maka variabel yang dideklarasikan dengan var
tidak dapat dihapus.
2. Tanpa Menggunakan var
Ketika mencoba untuk menetapkan nilai ke nama tanpa menggunakan var
kata kunci, Javascript mencoba untuk menemukan referensi bernama dalam apa yang disebut spesifikasi ECMAScript " LexicalEnvironment ", dan perbedaan utama adalah bahwa LexicalEvironment s bersarang - yaitu LexicalEnvironment memiliki induk ( apa yang disebut spesifikasi ECMAScript sebagai "referensi lingkungan luar") dan ketika Javscript gagal menemukan referensi dalam LexicalEenvironment , itu terlihat di induknya LexicalEnvironment (sebagaimana dirinci dalam 10.3.1 dan 10.2.2.1 ). LexicalEnvironment tingkat atas adalah " lingkungan global", dan yang terikat ke objek global di mana rujukannya adalah properti objek global. Jadi, jika Anda mencoba mengakses nama yang tidak dideklarasikan menggunakan var
kata kunci dalam lingkup saat ini atau cakupan luar apa pun, Javascript pada akhirnya akan mengambil sebuah properti dari window
objek untuk dijadikan referensi itu. Seperti yang telah kita pelajari sebelumnya, properti pada objek dapat dihapus.
Catatan
Penting untuk diingat bahwa var
deklarasi "diangkat" - yaitu deklarasi selalu dianggap terjadi di awal ruang lingkup di mana mereka berada - meskipun bukan inisialisasi nilai yang dapat dilakukan dalam var
pernyataan - yang dibiarkan berada di tempat pernyataan . Jadi dalam kode berikut, a
adalah referensi dari VariableEnvironment dan bukan window
properti dan nilainya akan berada 10
di akhir kode:
function test() { a = 5; var a = 10; }
Diskusi di atas adalah ketika "mode ketat" tidak diaktifkan. Aturan pencarian sedikit berbeda ketika menggunakan "mode ketat" dan referensi leksikal yang akan diselesaikan ke properti jendela tanpa "mode ketat" akan menimbulkan "kesalahan variabel" yang tidak dideklarasikan di bawah "mode ketat". Saya tidak benar-benar mengerti di mana ini ditentukan, tetapi bagaimana browser berperilaku.
var
fungsi di luar) adalah properti dari "objek global", yang ada di browser webwindow
. Jadi -var a = 1; delete window.a; console.log(a);
akan berhasil menghapus variabel dan menyebabkan baris terakhir mengeluarkan kesalahan referensi.var a = 1; delete window.a; console.log(a);
menampilkan 1.1
dengan benar di semua browser. Berjalan di dokumen nyata, contoh kode Anda sudah benar. Saya memilih jawaban Anda sebagai benar, tetapi saya akan menghargai jika Anda dapat mengeditnya untuk menyertakan penjelasanwindow.a = 1; delete window.a;
dan mungkin mekanismenya. Saya bisa melakukannya juga jika Anda tidak keberatan.Jawaban @ scunlife akan bekerja, tetapi secara teknis seharusnya
delete seharusnya menjadi no-op ketika target bukan properti objek. misalnya,
Tetapi karena variabel global sebenarnya adalah anggota objek jendela, ia berfungsi.
Ketika rantai prototipe terlibat, menghapus menggunakan menjadi lebih kompleks karena hanya menghilangkan properti dari objek target, dan bukan prototipe. misalnya,
Jadi berhati-hatilah.
EDIT: Jawaban saya agak tidak akurat (lihat "Kesalahpahaman" di bagian akhir). Tautan menjelaskan semua detail berdarah, tetapi ringkasannya adalah bahwa mungkin ada perbedaan besar antara browser dan tergantung pada objek yang Anda hapus.
delete object.someProp
umumnya harus aman selamaobject !== window
. Saya masih tidak akan menggunakannya untuk menghapus variabel yang dideklarasikan denganvar
meskipun Anda bisa dalam keadaan yang tepat.sumber
var
adalah ketika variabel tersebut dideklarasikan denganeval
.Jika Anda secara implisit mendeklarasikan variabel tanpa
var
, cara yang tepat adalah menggunakandelete foo
.Namun setelah Anda menghapusnya, jika Anda mencoba menggunakan ini dalam operasi seperti penambahan
ReferenceError
akan dibuang karena Anda tidak dapat menambahkan string ke pengidentifikasi yang tidak dideklarasikan, tidak terdefinisi. Contoh:Dalam beberapa situasi mungkin lebih aman untuk menetapkannya sebagai false, null, atau undefined sehingga dideklarasikan dan tidak akan membuang jenis kesalahan ini.
Perhatikan bahwa di ECMAScript
null
,false
,undefined
,0
,NaN
, atau''
semua akan mengevaluasifalse
. Pastikan Anda tidak menggunakan!==
operator tetapi!=
saat mengetik memeriksa boolean dan Anda tidak ingin memeriksa identitas (begitunull
juga== false
danfalse == undefined
).Perhatikan juga bahwa
delete
tidak "menghapus" referensi tetapi hanya properti secara langsung pada objek, misalnya:Jika Anda telah mendeklarasikan variabel dengan
var
Anda tidak dapat menghapusnya:Dalam Badak:
Anda juga tidak dapat menghapus beberapa properti yang telah ditentukan seperti
Math.PI
:Ada beberapa pengecualian aneh untuk
delete
bahasa apa pun, jika Anda cukup peduli, Anda harus membaca:sumber
sumber
delete
.delete
hanya berfungsi untuk properti. Pengaturan itunull
variabel masih ada.TLDR: sederhana didefinisikan variabel (tanpa
var
,let
,const
) dapat dihapus dengandelete
. Jika Anda menggunakanvar
,let
,const
- mereka tidak dapat dihapus tidak dengandelete
atau denganReflect.deleteProperty
.Chrome 55:
FF Nightly 53.0a1 menunjukkan perilaku yang sama.
sumber
var
kasus. Bagi saya itu menarik untuk diuji dan dibagikanlet
sertaconst
kasing juga. Namun, terima kasih atas perhatiannya. Akan mencoba lebih spesifik waktu berikutnya.ECMAScript 2015 menawarkan Reflect API. Dimungkinkan untuk menghapus properti objek dengan Reflect.deleteProperty () :
Untuk menghapus properti
window
objek global :Dalam beberapa kasus, properti tidak dapat dihapus (ketika properti tidak dapat dikonfigurasi) dan kemudian fungsi ini kembali
false
(serta menghapus operator ). Dalam kasus lain pengembaliantrue
:Ada perbedaan antara
deleteProperty
fungsi dandelete
operator saat dijalankan dalam mode ketat:sumber
Variabel, berbeda dengan properti sederhana, memiliki atribut [[Dapat Dikonfigurasi]] , yang berarti ketidakmungkinan untuk menghapus variabel melalui operator hapus . Namun ada satu konteks eksekusi yang tidak memengaruhi aturan ini. Ini adalah konteks eval : ada [[Dapat Dikonfigurasi]] atribut tidak diatur untuk variabel.
sumber
Operator hapus menghapus properti dari objek.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
Menurut pertanyaan, Anda perlu salah satu dari berikut ini
sumber
Selain apa yang ditulis semua orang, catat juga bahwa
delete
mengembalikan boolean. Ini dapat memberi tahu Anda apakah penghapusan berhasil atau tidak.Pengujian di Chrome, semuanya kecuali
let
dapat dihapus. ketikadelete
dikembalikantrue
itu benar-benar menghapusnya:sumber
let
vars danconst
vars itu mengembalikan benar apa yang seharusnya berarti bahwa variabel dihapus tetapi tidak. Anda bisa memeriksanya di Chrome dan FF. FF tampaknya mengembalikan nilai yang benar sementara Chrome tidak. Jadi jangan yakin Anda benar-benar bisa mengandalkannya. Coba lihat:let letVar = "1"; undefined delete letVar; true letVar "1" typeof letVar; "string" const constVar="1"; undefined delete constVar; true constVar; "1" typeof constVar; "string"
delete
operator bekerja. Tapi itu tidak menggambarkan mengapa situasi benar-benar berlawanan dengan fungsi. Sayang sekali. Namun, mengenai variabel, hal-hal mulai tampak jauh lebih jelas.Anda tidak dapat menghapus variabel jika Anda mendeklarasikannya (dengan var x;) pada saat pertama kali digunakan. Namun, jika variabel x Anda pertama kali muncul di skrip tanpa deklarasi, maka Anda dapat menggunakan operator hapus (delete x;) dan variabel Anda akan dihapus, sangat mirip dengan menghapus elemen array atau menghapus properti objek. .
sumber
Saya agak bingung. Jika semua yang Anda inginkan adalah agar nilai variabel tidak diteruskan ke skrip lain, maka tidak perlu menghapus variabel dari ruang lingkup. Cukup batalkan variabelnya, kemudian periksa secara eksplisit apakah variabel itu null atau bukan. Mengapa harus melalui masalah menghapus variabel dari ruang lingkup? Apa tujuan server ini yang membatalkan tidak bisa?
sumber
null
nilai yang tidak ingin saya picu.<?php if(isset($_POST['somevariable']) unset($_POST['somevariable']); if(isset($_GET['somevariable']) unset($_GET['somevariable']); ?>