1. Pertama perkenalkan 5 jenis asli
5 tipe primitif dalam javascript adalah string , angka , boolean , tidak terdefinisi , nol
var name = "jack"; var usia = 32; var single = false; var app; //undefinedConsole.log(typeof name); //stringconsole.log(typeof usia); //numberconsole.log(typeOf single); //booleanconsole.log(typeof App); //undefinedConsole.log(typeof null); //obyek
Ditemukan bahwa empat tipe dasar lainnya kecuali nol dapat diidentifikasi dengan tipe :
if (typeOf name === "string") {name += "zhang"; } if (typeof usia === "angka") {usia ++; } if (typeOf single === "boolean" && single) {...} if (typeof app === "undefined") {app = {}; }Karena tipe null akan mendapatkan objek, gunakan === Untuk mendeteksi nol secara langsung:
if (el === null) {...}2. Objek
Objek JavaScript termasuk objek bawaan ( tanggal, regexp, kesalahan , dll.) Dan objek kustom .
(Perhatikan bahwa meskipun fungsi dan array juga merupakan objek bawaan, mereka dibahas secara terpisah di bagian selanjutnya)
Objek tidak dapat dideteksi menggunakan tipe seperti tipe dasar, karena hasil yang terdeteksi semuanya objek :
console.log (typeof new date ()); //objectConsole.log(type dari regexp baru ()); //objectConsole.log(type of new error ()); //objectConsole.log(type dari orang baru ()); //objectConsole.log(type dari orang baru ()); // Menggunakan typeof untuk mendeteksi bahwa objek kustom juga objek
Untuk menggunakan instanceof sebagai gantinya untuk mendeteksi:
var date = new date (); var reg = regexp baru (); var err = new error (); var me = new person (); if (date instance dari tanggal) {// tanggal deteksi tahun = date.getlyear (); } if (Reg instanceof regexp) {// deteksi ekspresi reguler reg.test (...); } if (err instance dari kesalahan) {// deteksi pengecualian terlempar err; } if (saya instance dari orang) {// Deteksi Objek Kustom ...} Tetapi ada masalah dengan objek khusus, dengan asumsi orang itu didefinisikan dalam frame dan frameB browser. Objek ME didefinisikan dalam framea, dan terdeteksi sebagai benar menggunakan me instanceof Person . Tetapi ketika objek kustom saya diteruskan ke FrameB, instanceof akan salah di Frameb.
Seperti yang disebutkan di awal bagian ini, meskipun fungsi dan array juga merupakan objek bawaan, mereka dibiarkan ke bagian berikutnya. Alasannya adalah bahwa fungsi dan array juga memiliki masalah yang sama di atas sebagai objek khusus. Oleh karena itu, fungsi dan array umumnya tidak menggunakan instanceof
3. Fungsi
Di atas mengatakan bahwa menggunakan Fungsi Deteksi Contoh tidak dapat melintasi bingkai. Oleh karena itu, TypeOF digunakan untuk mendeteksi, yang bisa cross-frame:
var func = function () {}; if (typeOf func === 'function') {...}Namun, IE8 menggunakan tipeof untuk mendeteksi fungsi DOM dan akan mendapatkan objek, jadi IE8 digunakan dalam:
console.log (typeof document.getElementById); // objek, bukan functionConsole.log (typeof document.getElementsByTagname); // objek, bukan functionConsole.log (typeof document.createElement); //object, not function//IE browsers before IE8, use in to detect whether the DOM function is supported if("getElementById" in document) { … } if("getElementsByTagName" in document) { … } if("getElementsByTagName" in document) { … } if("createElement" in document) { … }4. Array
Di atas mengatakan bahwa menggunakan instanceof untuk mendeteksi array itu tidak dapat melintasi bingkai. Sebelum ES5, kami memiliki metode deteksi khusus. Metode yang paling akurat: tostring yang tergantung pada array akan mengembalikan string tetap "[array objek]" untuk mendeteksi :
fungsi isArray (arr) {return object.prototype.toString.call (arr) === "[array objek]";}Metode ini tepat dan elegan, jadi diadopsi oleh banyak perpustakaan. Akhirnya, Array diperkenalkan sebagai metode IsArray di ES5, merujuk pada MDN. Sekarang Anda tidak perlu menyesuaikan metode deteksi, cukup gunakan isArray () .
Metode deteksi lainnya memiliki cacat sendiri dan tidak dapat 100% akurat. Tetapi sebagai cara berpikir, itu dapat dipelajari darinya. Misalnya, mengandalkan fakta bahwa array adalah satu -satunya objek yang berisi metode sortir terdeteksi:
fungsi isArray (arr) {return typeof arr.sort === "function";}Jika metode pengurutan juga didefinisikan untuk objek khusus, metode ini tidak valid.
V. Atribut
Mendeteksi apakah properti harus digunakan dalam objek instan. Jika Anda tidak peduli apakah atributnya ada di objek instan atau dalam objek prototipe, Anda dapat menggunakannya
Misalnya, mendeteksi sifat objek literal:
var person = {name: "jack", usia: 33}; if ("name" secara pribadi) {...} //trueif(person.hasownproperty("name ")) {...} // trueMisalnya properti objek instan:
var person = function (name, use) {this.name = name; this.age = usia;}; person.prototype.location = "shanghai"; var me = orang baru ("jack", 33) if ("name" in me) {...} //trueif(me.hasownproperty("name ")) {...} // trueif (" Lokasi "dalam diriku) {... //trueif(me.hasownproperty("location ")) {...} // falseMetode lain tidak bagus:
jika (objek [propname]) // tidak bagus, bagaimana Anda tahu bahwa nilai properti bukan 0 atau 1? if (objek [propname] === null) // tidak bagus, bagaimana Anda tahu bahwa nilai properti tidak nol? if (objek [propname] === Tidak ditentukan) // Tidak bagus, bagaimana Anda tahu bahwa nilai properti tidak ditentukan?
Meringkaskan
Gunakan TypeOf untuk mendeteksi string, angka, boolean, tidak terdefinisi, fungsi
Deteksi nol dengan ===
Deteksi array dengan isArray ()
Gunakan instanceof untuk mendeteksi objek bawaan (kecuali fungsi dan array) dan objek kustom
Gunakan HasownProperty untuk mendeteksi apakah properti ada di objek instan. Jika Anda tidak peduli apakah atributnya ada di objek instan atau dalam objek prototipe, Anda dapat menggunakannya
Oke, itu saja untuk artikel ini tentang cara mendeteksi berbagai jenis javascript. Saya harap semua orang dapat mempelajari konten artikel ini dengan cermat, yang mungkin bermanfaat bagi semua orang untuk belajar JavaScript.