Desain bahasa JavaScript tidak cukup ketat, dan banyak tempat akan membuat kesalahan jika Anda tidak hati -hati.
Misalnya, pertimbangkan situasi berikut.
Sekarang, kita perlu menentukan apakah objek global ada, dan jika tidak ada, nyatakan. Algoritma yang dijelaskan dalam bahasa alami adalah sebagai berikut:
if (myobj tidak ada) {declare myobj; }Anda mungkin merasa mudah untuk menulis kode ini. Namun pada kenyataannya, masalah tata bahasa yang melibatkannya jauh lebih rumit daripada yang kita pikirkan. Juriy Zaytsev menunjukkan bahwa ada lebih dari 50 cara untuk menentukan apakah ada objek JavaScript. Hanya ketika detail implementasi bahasa JavaScript sangat jelas, mereka dapat dibedakan.
Cara pertama untuk menulis
Berdasarkan intuisi Anda, Anda mungkin berpikir Anda dapat menulis ini:
if (! myobj) {myobj = {}; }Namun, jika Anda menjalankan kode ini, browser akan langsung melempar kesalahan referensi, menyebabkan operasi terganggu. Ada apa?
Ngomong -ngomong, ketika pernyataan IF menentukan apakah myobj kosong, variabel ini belum ada, sehingga kesalahan akan dilaporkan. Ubah ke yang berikut dan akan berjalan dengan benar.
if (! myobj) {var myobj = {}; }Mengapa kesalahan tidak dilaporkan setelah menambahkan VAR? Apakah Myobj sudah ada dalam kasus ini ketika pernyataan IF membuat penilaian?
Untuk menjawab pertanyaan ini, Anda harus tahu bagaimana penerjemah JavaScript bekerja. Bahasa JavaScript adalah "Parse First, Run Later". Deklarasi variabel diselesaikan selama penguraian, sehingga kode di atas sebenarnya setara dengan:
var myobj; if (! myobj) {var myobj = {}; }Oleh karena itu, ketika pernyataan IF membuat penilaian, Myobj memang ada, jadi tidak ada kesalahan. Ini adalah efek "peningkatan kode" dari perintah VAR. JavaScript hanya interpreter "mengangkat" variabel yang ditentukan oleh perintah VAR, dan tidak berfungsi untuk variabel yang tidak menggunakan perintah var dan langsung menetapkan. Inilah sebabnya mengapa itu akan menyebabkan kesalahan jika Anda tidak menambahkan var.
Cara kedua untuk menulis
Selain perintah VAR, mungkin ada penulisan ulang lain dan Anda juga bisa mendapatkan hasil yang benar:
if (! window.myobj) {myobj = {}; }Jendela adalah objek tingkat atas dari JavaScript, dan semua variabel global adalah propertinya. Oleh karena itu, menilai apakah myobj kosong setara dengan menilai apakah objek jendela memiliki atribut myobj, sehingga dapat menghindari kesalahan referensi karena myobj tidak didefinisikan. Namun, dari standardisasi kode, yang terbaik adalah menambahkan VAR ke baris kedua:
if (! window.myobj) {var myobj = {}; }Atau tulis seperti ini:
if (! window.myobj) {window.myobj = {}; }Cara ketiga untuk menulis
Kerugian dari metode penulisan di atas adalah bahwa di beberapa lingkungan operasi (seperti V8 dan Badak), jendela mungkin bukan objek tingkat atas. Jadi, pertimbangkan untuk menulis ulang sebagai:
if (! this.myobj) {this.myobj = {}; }Pada level variabel global, kata kunci ini selalu menunjuk ke variabel tingkat atas, sehingga dapat independen dari lingkungan operasi yang berbeda.
Cara keempat untuk menulis
Namun, tulisan di atas tidak dapat dibaca dengan buruk, dan menunjuknya adalah variabel dan rentan kesalahan, sehingga lebih lanjut ditulis ulang:
var global = ini; if (! Global.myobj) {global.myobj = {}; }Jauh lebih jelas untuk menggunakan variabel khusus global untuk mewakili objek tingkat atas.
Cara Kelima untuk Menulis
Anda juga dapat menggunakan tipe Operator untuk menentukan apakah MyOBJ didefinisikan.
if (typeof myobj == "tidak terdefinisi") {var myobj = {}; }Ini adalah metode yang paling banyak digunakan untuk menentukan apakah ada objek JavaScript.
Cara keenam untuk menulis
Karena nilai myobj secara langsung sama dengan tidak terdefinisi dalam kasus yang ditentukan tetapi tidak ditetapkan, metode penulisan di atas dapat disederhanakan:
if (myobj == tidak terdefinisi) {var myobj = {}; }Ada dua tempat yang perlu diperhatikan di sini. Pertama, kata kunci VAR pada baris kedua tidak boleh hilang, jika tidak, kesalahan ReferenceError akan terjadi. Kedua, tidak terdefinisi tidak dapat ditambahkan dengan kutipan tunggal atau ganda, karena tipe data yang tidak terdefinisi dibandingkan di sini, daripada string "tidak terdefinisi".
Cara ketujuh untuk menulis
Metode penulisan di atas masih valid dalam kondisi "perbandingan akurat" (===):
if (myobj === tidak terdefinisi) {var myobj = {}; }Cara kedelapan untuk menulis
Menurut desain bahasa JavaScript, tidak terdefinisi == NULL, sehingga Anda juga bisa mendapatkan hasil yang benar dengan membandingkan apakah myobj sama dengan nol:
if (myobj == null) {var myobj = {}; }Namun, meskipun hasil operasinya benar, semantik, metode penilaian ini salah dan harus dihindari. Karena NULL mengacu pada objek kosong yang telah ditugaskan ke NULL, yaitu, objek ini sebenarnya dinilai, sementara tidak terdefinisi mengacu pada objek yang tidak ada atau tidak memiliki penugasan. Oleh karena itu, Anda hanya dapat menggunakan "Bandingkan operator" (==) di sini, dan jika Anda menggunakan "operator perbandingan yang tepat" (===) di sini, Anda akan mendapatkan kesalahan.
Cara kesembilan untuk menulis
Anda juga dapat menggunakan operator untuk menentukan apakah MyOBJ adalah atribut dari objek tingkat atas:
if (! ('myobj' di jendela)) {window.myobj = {}; }Cara kesepuluh untuk menulis
Akhirnya, gunakan metode HasownProperty untuk menentukan apakah Myobj adalah properti dari objek tingkat atas:
if (! this.hasownproperty ('myobj')) {this.myobj = {}; }Meringkaskan
1. Jika Anda hanya menentukan apakah objek ada, disarankan untuk menggunakan metode penulisan kelima.
2. Jika di samping apakah objek ada, juga perlu untuk menentukan apakah objek memiliki nilai nol, disarankan untuk menggunakan metode penulisan pertama.
3. Kecuali ditentukan lain, semua variabel harus dinyatakan menggunakan perintah VAR.
4. Untuk cross-platform, disarankan untuk menghindari penggunaan jendela untuk mewakili objek tingkat atas.
5. Dalam bahasa JavaScript, nol dan tidak terdefinisi rentan terhadap kebingungan. Dalam kasus di mana keduanya mungkin terlibat, disarankan untuk menggunakan operator "perbandingan yang tepat" (===).
(lebih)
Contoh sederhana di atas tentang cara menilai apakah ada objek JavaScript adalah semua konten yang telah saya bagikan dengan Anda. Saya harap Anda dapat memberi Anda referensi dan saya harap Anda dapat mendukung wulin.com lebih lanjut.