Operator typeof
dan instanceof
keduanya digunakan untuk menentukan tipe data, namun skenario penggunaannya berbeda, dan beberapa detail memerlukan perhatian khusus. Yuk cari tahu selanjutnya, kuasai betul poin pengetahuan ini, dan jangan takut lagi dengan pertanyaan pewawancara.
typeof
operator unary yang ditempatkan di depan operan, yang bisa bertipe apa saja. Ia mengembalikan string yang menjelaskan tipe operan. Silakan lihat kastanye:
const type = typeof 'Long Live China'; // string ketik 666; //nomor tipe benar; // boolean tipe tidak terdefinisi; // tidak terdefinisi typeof Simbol(); // simbol ketik 1n; // bigint typeof() => {}; // fungsi tipe []; // objek tipe {}; // objek typeof String baru('xxx'); // objek typeof null; // objek
Seperti yang dapat dilihat dari contoh di atas, typeof
hanya dapat secara akurat menentukan tipe data dasar dan fungsi (fungsi sebenarnya adalah objek dan bukan milik tipe data lain, tetapi mereka juga dapat dibedakan menggunakan typeof) dan tidak bisa ditentukan secara akurat. Tipe data referensi keluar (semua objek kembalian).
Satu hal yang perlu diperhatikan adalah pemanggilan typeof null
akan mengembalikan object
. Hal ini karena nilai khusus null
dianggap sebagai referensi ke objek null (juga disebut penunjuk objek null).
Jika Anda ingin menentukan tipe data referensi secara akurat, Anda dapat menggunakan operator instanceof
.
Operator instanceof
ditempatkan setelah operan dan sebelum objek tertentu. Ia mengembalikan nilai Boolean yang menunjukkan apakah operan merupakan turunan dari objek yang diberikan:
const result = [] instanceof Array; const Orang = fungsi() {}; const p = Orang baru(); p contoh Orang; // benar pesan const = String baru('xxx');pesan instanceof String; //
sebenarnya
typeof akan mengembalikan tipe dasar operan, instanceof mengembalikan nilai Boolean
instanceof dapat secara akurat menentukan tipe data referensi, tetapi tidak dapat menentukan
tipe data dasar dengan benar meskipun dapat menentukan tipe data dasar ( kecuali null) , tetapi tidak mungkin untuk menentukan tipe data referensi (kecuali fungsi)
typeof
maupun instanceof
memiliki kelemahan tertentu dan tidak dapat memenuhi kebutuhan semua skenario. Jika Anda perlu mendeteksi tipe data secara universal, Anda bisa menggunakan metode Object.prototype.toString.call()
:
Object.prototype.toString.call({}); // "[object Object]" Objek.prototipe.toString.call([]); // "[Array objek]" Objek.prototipe.toString.call(666); // "[Nomor objek]" Object.prototype.toString.call('xxx'); // "[object String]"
Perhatikan bahwa metode ini mengembalikan string dalam format "[object Object]"
.
Agar lebih mudah digunakan, kita dapat merangkum metode ini:
function getType(value) { biarkan tipe = tipe nilai; if (type !== 'object') {// Jika ini adalah tipe data dasar, kembalikan secara langsung tipe pengembalian; } // Jika itu adalah tipe data referensi, penilaian lebih lanjut dibuat, dan hasil pengembalian reguler adalah return Object.prototype.toString.call(value).replace(/^[object (S+)]$/, ' $1'); } getType(123); // nomor getType('xxx'); // string getType(() => {}); // fungsi getType([]); // Array getType({}); // Objek getType(nol); // Batal