Di ES3, penghapusan diperkenalkan di 8.6.2.5 dan 11.4.1, sebagai berikut
Ada beberapa informasi,
1. Operator delete dalam implementasinya akan memanggil metode [[Delete]] di dalam mesin.
2. [[Hapus]] didefinisikan di 8.6.2
3. Atribut yang dihapus memiliki fitur DontDelete. Jika demikian, false akan langsung dikembalikan saat dihapus.
Cari "DontDelete" dan Anda akan menemukan banyak hal berikut ini yang dapat dihapus.
1. Aktifkan argumen objek dari objek (10.1.6)
Copy kode kodenya sebagai berikut:
fungsi fungsi() {
hapus argumen;
peringatan(argumen);
}
fungsi(1);
2. Deklarasi variabel (10.2.1)
Copy kode kodenya sebagai berikut:
var a = 10;
hapus sebuah;
peringatan(a); // 10
Item ini disebutkan di banyak buku JS, yaitu variabel yang dideklarasikan menggunakan var tidak dapat dihapus.
3. Deklarasi fungsi
Copy kode kodenya sebagai berikut:
fungsi fungsi() {}
hapus fungsi;
peringatan(fungsi); // kode fungsi
4. Atribut panjang suatu fungsi
Copy kode kodenya sebagai berikut:
fungsi fungsi(a, b) {}
hapus fungsi.length;
peringatan(fungsi.panjang); // 2
5. Beberapa konstanta (NaN, Infinity, tidak terdefinisi)
Copy kode kodenya sebagai berikut:
hapus NaN; // salah
hapus Tak Terbatas; // salah
hapus tidak terdefinisi; // salah
6. Prototipe konstruktor bawaan
Copy kode kodenya sebagai berikut:
hapus Objek.prototipe; // false
hapus Fungsi.prototipe; // false
hapus Array.prototipe; // false
hapus ExpReg.prototipe; // false
hapus Tanggal.prototipe; // false
hapus Error.prototipe; // salah
hapus Nomor.prototipe; // false
hapus Boolean.prototipe; // false
hapus String.prototipe; // false
7. Panjang array dan string
Copy kode kodenya sebagai berikut:
var arr = [], str = 'halo';
hapus arr.length; // salah
hapus str.panjang; // salah
8. Sifat-sifat objek Matematika (Math.E, Math.LN10, Math.LN2, Math.LOG2E, Math.LOG10E, Math.PI, Math.SQRT1_2, Math.SQRT2)
Copy kode kodenya sebagai berikut:
hapus Math.E; // salah
...
9. Properti objek biasa (sumber, global, abaikanCase, multiline, lastIndex)
Copy kode kodenya sebagai berikut:
varreg = /ss/;
hapus reg.source; // salah
...
ES5 berbeda dari ES3. Tidak ada "DontDelete" di ES5, tetapi [[Dapat Dikonfigurasi]] (8.6.1) ditambahkan.
Jika nilainya salah, maka tidak dapat dihapus. Sembilan poin yang tercantum di atas dijelaskan dalam ES5 sebagai [[Dapat Dikonfigurasi]] salah.
Metode Object.defineProperty baru di ES5 dapat menampilkan Konfigurasi objek yang ditentukan, sebagai berikut
Copy kode kodenya sebagai berikut:
var obj = {nama: 'John'};
Objek.defineProperty(obj, "kunci", {
dapat dikonfigurasi: salah,
nilai: "statis"
});
hapus objek.nama; // benar
hapus obj.key // false
Objek objek memiliki nama dan kunci. Namanya bisa dihapus, tapi kuncinya tidak bisa.
Selain itu, dalam mode ketat ES5, pengecualian akan langsung dilempar saat menghapus objek yang konfigurasinya salah. menyukai
Copy kode kodenya sebagai berikut:
"gunakan ketat";
hapus Objek.prototipe;
Console error di FF adalah sebagai berikut:
Selain beberapa metode atau properti objek bawaan yang tidak dapat dihapus, ada juga objek khusus yang tidak dapat dihapus. Misalnya, delete tidak bisa menghapus objek yang mewarisi properti dari prototipe.
Copy kode kodenya sebagai berikut:
fungsi Orang() {}
Person.prototype.name = 'John Backus';
var p = Orang baru();
hapus p.nama;
console.log(p.name); // Masih menampilkan John Backus
Jika ada nama dan prototipenya, maka setelah dihapus, prototipe tersebut akan ditampilkan.
Copy kode kodenya sebagai berikut:
fungsi Orang() {
this.name = 'John Backus';
}
Person.prototype.name = 'John Resig';
var p = Orang baru();
console.log(p.nama); // John Backus
hapus p.nama;
console.log(p.name); // John Resig, dari prototipe
Kalau harus menghapus nama di prototype saja bisa
Copy kode kodenya sebagai berikut:
hapus Person.prototype.name
Untuk meringkas:
1. Sebagian besar properti dan metode objek bawaan tidak dapat dihapus (meskipun beberapa dapat dihapus, seperti isNaN dan parseInt)
2. Properti dan metode yang diwarisi suatu objek dari prototipe tidak dapat dihapus.
Alasannya juga sangat sederhana,
1. Sebagian besar properti dan metode objek bawaan tidak dapat dihapus untuk melindungi API inti bahasa tersebut. Setelah API ini dihapus, pada dasarnya tidak ada gunanya. Seperti menghapus Objek.prototipe.
2. Atribut dan metode yang diwarisi objek dari prototipe tidak dapat dihapus untuk melindungi prototipe. Jika tidak, "jika objek kelas A menghapus atribut pada prototipe, maka semua objek yang diwarisi dari A akan kehilangan atribut tersebut."