Desain bahasa Javascript tidak cukup ketat, dan kesalahan dapat terjadi di banyak tempat jika Anda tidak berhati-hati.
Misalnya, perhatikan situasi berikut.
Sekarang, kita perlu menentukan apakah objek global myObj ada. Jika tidak ada, deklarasikan. Algoritma yang dijelaskan dalam bahasa alami adalah sebagai berikut:
Copy kode kodenya sebagai berikut:
jika (Obj saya tidak ada){
nyatakan myObj;
}
Anda mungkin berpikir bahwa menulis kode ini mudah. Namun pada kenyataannya, permasalahan tata bahasa yang terlibat jauh lebih kompleks dari yang kita bayangkan. Juriy Zaytsev menunjukkan bahwa ada lebih dari 50 cara untuk menentukan apakah suatu objek Javascript ada. Hanya jika Anda sangat jelas tentang detail implementasi bahasa Javascript, Anda dapat membedakan keduanya.
Cara penulisan yang pertama
Secara intuitif, Anda mungkin berpikir Anda bisa menulis:
Copy kode kodenya sebagai berikut:
jika (!objsaya) {
Obj saya = {};
}
Namun, saat menjalankan kode ini, browser akan langsung menampilkan kesalahan ReferrenceError sehingga menyebabkan pengoperasian terhenti. Ada apa?
Ngomong-ngomong, ketika pernyataan if menentukan apakah myObj kosong, variabelnya belum ada, jadi kesalahan dilaporkan. Ubah ke yang berikut ini dan itu akan berjalan dengan benar.
Copy kode kodenya sebagai berikut:
jika (!objsaya) {
var Objsaya = {};
}
Mengapa tidak ada kesalahan setelah menambahkan var? Mungkinkah dalam kasus ini, ketika pernyataan if membuat keputusan, apakah myObj sudah ada?
Untuk menjawab pertanyaan ini, Anda harus mengetahui cara kerja penerjemah Javascript. Bahasa Javascriptnya adalah "parse dulu, jalankan nanti". Deklarasi variabel sudah selesai saat parsing, jadi kode di atas sebenarnya setara dengan:
Copy kode kodenya sebagai berikut:
var Obj Saya;
jika (!objsaya) {
var Objsaya = {};
}
Oleh karena itu, ketika pernyataan if membuat penilaian, myObj sudah ada, sehingga tidak ada kesalahan yang dilaporkan. Ini adalah efek "pengangkatan kode" dari perintah var. Penerjemah Javascript hanya "mempromosikan" variabel yang ditentukan oleh perintah var, dan tidak bekerja pada variabel yang ditetapkan secara langsung tanpa menggunakan perintah var. Inilah sebabnya kesalahan akan dilaporkan jika var tidak ditambahkan.
Cara penulisan yang kedua
Selain perintah var, ada penulisan ulang lain yang juga bisa mendapatkan hasil yang benar:
Copy kode kodenya sebagai berikut:
if (!window.myObj) {
Obj saya = {};
}
Window adalah objek tingkat atas JavaScript, dan semua variabel global adalah propertinya. Oleh karena itu, menentukan apakah myobj kosong sama dengan menentukan apakah objek window memiliki atribut myobj. Hal ini dapat menghindari kesalahan ReferrerError karena myObj tidak ditentukan. Namun, dari standarisasi kode, yang terbaik adalah menambahkan var ke baris kedua:
Copy kode kodenya sebagai berikut:
if (!window.myObj) {
var Objsaya = {};
}
Atau ditulis seperti ini:
if (!window.myObj) {
jendela.myObj = { };
}
Cara penulisan yang ketiga
Kerugian dari metode penulisan di atas adalah di beberapa lingkungan berjalan (seperti V8, Rhino), window mungkin bukan objek tingkat atas. Jadi, pertimbangkan untuk menulis ulang sebagai:
Copy kode kodenya sebagai berikut:
if (!ini.objsaya) {
ini.objsaya = { };
}
Pada tingkat variabel global, kata kunci this selalu menunjuk ke variabel tingkat atas, sehingga dapat independen terhadap lingkungan berjalan yang berbeda.
Cara penulisan yang keempat
Namun cara penulisan di atas kurang terbaca, dan penunjuknya bervariasi dan rawan kesalahan, jadi kami menulis ulang lebih lanjut:
Copy kode kodenya sebagai berikut:
var global = ini;
jika (!global.myObj) {
global.myObj = { };
}
Jauh lebih jelas menggunakan variabel khusus global untuk mewakili objek tingkat atas.
Cara penulisan yang kelima
Anda juga dapat menggunakan operator typeof untuk menentukan apakah myObj didefinisikan.
Copy kode kodenya sebagai berikut:
if (typeof myObj == "tidak terdefinisi") {
var Objsaya = {};
}
Saat ini metode ini paling banyak digunakan untuk menentukan apakah suatu objek JavaScript ada.
Cara keenam untuk menulis
Karena nilai myObj sama langsung dengan undefinisi ketika ditentukan tetapi tidak ditetapkan, cara penulisan di atas dapat disederhanakan:
Copy kode kodenya sebagai berikut:
jika (myObj == tidak terdefinisi) {
var Objsaya = {};
}
Ada dua hal yang perlu diperhatikan di sini. Pertama, kata kunci var pada baris kedua tidak boleh hilang, jika tidak maka akan terjadi ReferError. Kedua, undefinisi tidak dapat ditambah dengan tanda kutip tunggal atau tanda kutip ganda, karena di sini tipe data yang tidak terdefinisi dibandingkan, bukan "tidak terdefinisi" String ini.
Cara penulisan yang ketujuh
Cara penulisan di atas masih berlaku dalam kasus "perbandingan tepat" (===):
Copy kode kodenya sebagai berikut:
if (myObj === tidak terdefinisi) {
var Objsaya = {};
}
Cara penulisan yang kedelapan
Menurut desain bahasa JavaScript, tidak terdefinisi == null, jadi membandingkan apakah myObj sama dengan null juga bisa mendapatkan hasil yang benar:
Copy kode kodenya sebagai berikut:
jika (Obj saya == nol) {
var Objsaya = {};
}
Namun, meskipun hasil yang dijalankan benar, dari sudut pandang semantik, metode penilaian ini salah dan harus dihindari. Karena null mengacu pada objek kosong yang telah diberi nilai null, artinya objek tersebut sebenarnya memiliki nilai, sedangkan undefinisi mengacu pada objek yang tidak ada atau tidak memiliki nilai yang ditetapkan. Oleh karena itu, hanya "operator perbandingan" (==) yang dapat digunakan di sini. Jika "operator perbandingan tepat" (===) digunakan di sini, kesalahan akan terjadi.
Cara penulisan yang kesembilan
Anda juga dapat menggunakan operator in untuk menentukan apakah myObj merupakan atribut objek tingkat atas:
Copy kode kodenya sebagai berikut:
if (!('myObj' di jendela)) {
jendela.myObj = { };
}
Cara penulisan yang kesepuluh
Terakhir, gunakan metode hasOwnProperty untuk menentukan apakah myObj adalah properti objek tingkat atas:
Copy kode kodenya sebagai berikut:
if (!ini.hasOwnProperty('myObj')) {
ini.objsaya = { };
}
Meringkaskan
1. Jika hanya menentukan apakah objek tersebut ada, disarankan menggunakan cara penulisan yang kelima.
2. Jika selain apakah objek tersebut ada, Anda juga perlu menentukan apakah objek tersebut memiliki nilai null, disarankan menggunakan cara penulisan yang pertama.
3. Kecuali ada keadaan khusus, semua variabel harus dideklarasikan menggunakan perintah var.
4. Agar menjadi lintas platform, disarankan untuk menghindari penggunaan jendela untuk mewakili objek tingkat atas.
5. Dalam bahasa Javascript, null dan unfine mudah tertukar. Jika keduanya mungkin terlibat, disarankan untuk menggunakan operator "perbandingan tepat" (===).