Dalam proses menulis program JS, Anda mungkin sering perlu menilai jenis objek. Misalnya, jika Anda menulis fungsi, Anda perlu menulis kode yang berbeda dengan menilai jenis parameter yang berbeda.
Pertama, Anda mungkin memikirkan tipe operator, dan lihat contoh berikut:
<script type = "text/javascript"> var objek = {}; var b = true; Peringatan (TypeOf Object + "" + Typeof B); </script>Hasil yang diperoleh adalah sebagai berikut:
Dari hasil di atas, kita dapat melihat bahwa jenis objek dapat ditampilkan menggunakan operator TypeOF. Jadi apa yang akan menjadi hasil dari ruang lingkup operator tipe NULL dan tidak terdefinisi?
/*var objek = {}; var b = true; Peringatan (TypeOf Object + "" + TypeOf B);*/ ALERT (TYPEOF NULL + "" + TYPEOF tidak ditentukan)Jenis operator bertindak di nol dan benar -benar menampilkan "objek" (ini tampaknya tidak ilmiah, saya pikir itu akan menampilkan "null '"), dan tampilan yang tidak ditentukan "tidak ditentukan" (ini memenuhi hasil yang kami harap). Oleh karena itu, saat menggunakan tipe operator untuk menilai jenis objek, berhati -hatilah, karena objek ini mungkin nol. Di atas hanya memberikan beberapa hasil jenis yang bertindak pada objek -objek ini. Tabel berikut mencantumkan hasil dari operator tipe yang bertindak pada boolean, angka, string, array, tanggal, regexp, objek, fungsi, nol, tidak terdefinisi (pembaca yang tertarik dapat mengujinya sendiri):
Dari hasil tabel di atas, kita dapat melihat bahwa array, tanggal, dan regexp menampilkan semua objek, jadi mengapa tidak secara langsung menampilkan jenis objek? Ini membutuhkan operator lain untuk diturunkan dari JS: instance dari operator, yang digunakan untuk menentukan apakah suatu objek adalah objek dari beberapa jenis, dan nilai yang dihitung benar atau salah. Mari kita lihat dulu:
var sekarang = tanggal baru (); var pola =/^[/s/s]*$/; var name = ['zq', 'John']; alert ((sekarang tanggal instance) + "" + (pola instanceof regexp) + "" + (nama instanceof array));
Jelas, jenis objek dapat dinilai melalui contoh ini, tetapi ini hanya dapat menilai jenis lain kecuali untuk tipe dasar (termasuk jenis string), dan tidak dapat menilai tipe dasar. Namun, contoh tidak selalu dapat dihakimi secara normal. Mempertimbangkan kasus kerangka kerja, untuk menentukan bahwa objek dari jenisnya adalah objek yang dilewatkan oleh bingkai lain, lihat contoh pertama.
Main.html
<! Doctype html> <html lang = "en"> <head> <title> utama </itement> </head> <frameset cols = "45%,*"> <frame name = "frame1" src = "frame1.html"//<frame = "frame2" src = "frame22.html"//</frame = "frame2" src = "frame2.html"
frame1.html
<! Doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <itement> frame1 </iteme> </head> <script type = "text/javascript"> var name = ['riccio zhang', 'zq', 'John']; </script> <body style = "latar belakang: #ccc"> </body> </html>
frame2.html
<! Doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <itement> frame2 </iteme> <script type = "text/javascript"> dokumen. document.write ("<br/>"); Document.write ("Top.Frame1.names Instanceof Top.Frame1.Array:" + (Top.Frame1.names Instanceof Top.Frame1.Array)); document.write ("<br/>"); Document.write ("Top.Frame1.Array === Top.Frame2.Array?" + (Top.Frame1.Array === Top.Frame2.Array)); </script> </head> <body style = "latar belakang: #747474"> </body> </html>Objek nama ada dalam kerangka frame1, dan dibuat oleh array kerangka frame1. Jika objek nama dibawa ke array di Frame2 untuk perbandingan, jelas bahwa nama bukan contoh array dalam frame2. Diperkirakan bahwa Frame1 dan Frame2 tidak sama dan array sama sekali. Dari hasil realistis kedua, dapat dilihat dengan jelas bahwa nama adalah contoh bingkai di mana ia berada. Dari output ketiga, dapat dilihat bahwa array frame1 dan array frame2 berbeda. Jadi apa yang harus saya lakukan jika saya menemukan perbandingan cross-frame di atas? Kami tidak dapat membandingkan array yang sesuai dengan kerangka kerja setiap saat. Ada cara yang diperlukan untuk menyelesaikan masalah di atas. Lihat kode berikut:
var toString = {} .toString; var sekarang = tanggal baru (); peringatan (tostring.call (sekarang)){} .toString berarti mendapatkan metode tostring pada objek objek (salah satu metode dasar objek objek saat metode ini), dan tostring.call (sekarang) berarti memanggil metode ToString. Memanggil ToString yang paling asli () dari objek tanggal (metode ini adalah metode metode di atas) dapat menampilkan string tipe [tanggal objek]. Jika array, kata [array objek] akan dihasilkan. Dengan kata lain, melakukan operasi di atas akan menampilkan kata -kata yang mirip dengan [kelas objek]. Jadi kita hanya perlu menilai string ini untuk mengetahui jenisnya? Dari sini, Anda dapat menulis kelas alat berikut:
Tools.js
var tool = (function (tidak terdefinisi) {var class2type = {}, toString = {} .toString; var fun = {type: function (obj) {return obj === null || obj === tidak terdefinisi? string (obj): class2Type [tostring.call (obj) (funge} {oBJ) (class2Type [tostring. === "Array"; i ++) {if (callback.call (arr [i], i, arr [i]) === false) {break}}}}}; }) ();Alat menyediakan metode seperti tipe, isArray, isfunction, dll. Untuk menilai jenis objek. Menurut kebutuhan aktual, Anda dapat menambahkan metode untuk menentukan jenisnya sendiri. Jenis menerima parameter OBJ, yang mengembalikan jenis objek yang sebenarnya dalam bentuk huruf kecil. Misalnya, jika Anda perlu menilai bahwa jenis objek adalah array, maka metode ini akan mengembalikan array.
Menurut kelas alat yang disediakan di atas, tulis ulang contoh di atas:
fram2.html
<! Doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <iteme> frame2 </iteme> <script type = "text/javascript" src = "tools.js"> <script> <script = "text/javascript"> document. Array)); document.write ("<br/>"); Document.write ("Top.Frame1.names Instanceof Top.Frame1.Array:" + (Top.Frame1.names Instanceof Top.Frame1.Array)); document.write ("<br/>"); Document.write ("Top.Frame1.Array === Top.Frame2.Array?" + (Top.Frame1.Array === Top.Frame2.Array)); document.write ("<br/>"); document.write ("tools.isarray (top.frame1.names)?" + tools.isarray (top.frame1.names)); </script> </head> <body style = "latar belakang: #747474"> </body> </html>Pada titik ini, jenis objek dapat dengan mudah dinilai oleh kelas di atas.
Catatan: Dalam IE, elemen seperti peringatan tidak dapat dinilai.