javascript之typeof、instanceof操作符使用探讨_基础知识
写javascirpt代码时,typeof和instanceof这两个操作符时不时就会用到,堪称必用。但是!使用它们总是不能直接的得到想要的结果,非常纠结,普遍的说法认为“这两个操作符或许是javascript中最大的设计缺陷,因为几乎不可能从他们那里得到想要的结果”
typeof
说明:typeof返回一个表达式的数据类型的字符串,返回结果为js基本的数据类型,包括number,boolean,string,object,undefined,function。
从说明来看,貌似没什么问题。
下面的代码写了一个数值变量,typeof后的结果是"number"。
var a = 1;
console.log(typeof(a)); //=>number
如果用Number类型的构造函数new一个变量的话,typeof后的结果是"object"。
var a = new Number(1);
console.log(typeof(a)); //=>object
上面的这两个输出结果看似没啥问题,这一点从书上看来是理所当然的事情,因为javascript就是这么设计的。
但是!问题就在于既然调用了typeof就应该准确返回一个变量的类型,不管是直接用值创建的还是用类型的构造函数创建的,否则!我还用你做啥!
那么对于:
var a = 1;
var b = new Number(1);
a和b变量的类型准确的说来都应该是Number才是想要的结果。
而准确的类型信息保存在变量的内部属性 [[Class]] 的值中,通过使用定义在 Object.prototype 上的方法 toString来获取。
获取类型信息:
var a = 1;
var b = new Number(1);
console.log(Object.prototype.toString.call(a));
console.log(Object.prototype.toString.call(b));
输出:
[object Number]
[object Number]
是不是已经很直接了,我们稍微处理一下,得到直接结果:
var a = 1;
var b = new Number(1);
console.log(Object.prototype.toString.call(a).slice(8,-1));
console.log(Object.prototype.toString.call(b).slice(8,-1));
输出:
Number
Number
这就是想要的结果。
为了更好的使用,我们封装一个方法,用来判断某个变量是否是某种类型:
function is(obj,type) {
var clas = Object.prototype.toString.call(obj).slice(8, -1);
return obj !== undefined && obj !== null && clas === type;
}
定义一些变量做过测试,先来看看它们的typeof输出:
var a1=1;
var a2=Number(1);
var b1="hello";
var b2=new String("hello");
var c1=[1,2,3];
var c2=new Array(1,2,3);
console.log("a1's typeof:"+typeof(a1));
console.log("a2's typeof:"+typeof(a2));
console.log("b1's typeof:"+typeof(b1));
console.log("b2's typeof:"+typeof(b2));
console.log("c1's typeof:"+typeof(c1));
console.log("c2's typeof:"+typeof(c2));
输出:
a1's typeof:number
a2's typeof:object
b1's typeof:string
b2's typeof:object
c1's typeof:object
c2's typeof:object
我们再用新作的函数是一下:
console.log("a1 is Number:"+is(a1,"Number"));
console.log("a2 is Number:"+is(a2,"Number"));
console.log("b1 is String:"+is(b1,"String"));
console.log("b2 is String:"+is(b2,"String"));
console.log("c1 is Array:"+is(c1,"Array"));
console.log("c2 is Array:"+is(c2,"Array"));
输出:
a1 is Number:true
a2 is Number:true
b1 is String:true
b2 is String:true
c1 is Array:true
c2 is Array:true
注:typeof也不是无用,实际用处是用来检测一个变量是否已经定义或者是否已经赋值。
instanceof
说明:判断一个对象是否为某一数据类型,或一个变量是否为一个对象的实例。
instanceof 操作符用来比较两个内置类型的变量时一样力不从心,同样会对结果不满意。
console.log("abc" instanceof String); // false
console.log("abc" instanceof Object); // false
console.log(new String("abc") instanceof String); // true
console.log(new String("abc") instanceof Object); // true
只有在比较自定义的对象时才准确反映关系。
function Person() {}
function Man() {}
Man.prototype = new Person();
console.log(new Man() instanceof Man); // true
console.log(new Man() instanceof Person); // true

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Fungsi instanceof adalah untuk menentukan sama ada objek adalah contoh kelas tertentu, atau sama ada ia melaksanakan antara muka tertentu. instanceof ialah operator yang digunakan untuk menyemak sama ada objek adalah jenis yang ditentukan. Senario penggunaan instanceof operator: 1. Pemeriksaan jenis: boleh digunakan untuk menentukan jenis objek tertentu, untuk melaksanakan logik yang berbeza mengikut jenis yang berbeza 2. Penghakiman antara muka: boleh digunakan untuk menentukan sama ada objek melaksanakan antara muka , untuk menentukan sama ada objek melaksanakan antara muka Definisi antara muka memanggil kaedah yang sepadan 3. Transformasi ke bawah, dsb.

Penggunaan kebanyakan arahan Linux menggunakan simbol '!' mungkin berbeza dalam cangkerang yang berbeza. Walaupun contoh yang saya sediakan biasanya digunakan dalam cengkerang bash, beberapa cangkerang Linux yang lain mungkin mempunyai pelaksanaan yang berbeza atau mungkin tidak menyokong penggunaan simbol '!' tertentu. Mari kita selami penggunaan simbol ‘!’ yang mengejutkan dan misteri dalam arahan Linux. 1. Gunakan nombor arahan untuk menjalankan arahan daripada sejarah Apa yang anda mungkin tidak tahu ialah anda boleh menjalankan arahan daripada sejarah arahan (perintah yang telah dilaksanakan). Mula-mula, cari nombor arahan dengan menjalankan arahan 'history'. linuxmi@linuxmi:~/www.linuxmi.

Pengendali sama modulo (%) ialah operator yang sangat biasa digunakan dalam PHP dan digunakan untuk mengira baki pembahagian dua nombor. Dalam artikel ini, kami akan melihat dengan lebih mendalam tentang penggunaan pengendali modular equals dan memberikan contoh kod khusus untuk membantu pembaca memahami dengan lebih baik. Pertama, mari kita lihat contoh mudah Katakan kita perlu mengira baki pembahagian satu nombor dengan yang lain: $a=10;$b=3;$remainder=$a%$b;echo"10 dibahagikan dengan 3 Bakinya. ialah: &

Di Java, instanceof ialah operator binari yang digunakan untuk menyemak sama ada objek ialah contoh kelas atau contoh subkelas kelas nama atau nama antara muka.

SQL dalam penggunaan operator: 1. Padanan lajur tunggal, anda boleh menggunakan operator IN untuk memadankan berbilang nilai dalam lajur 2. Padanan berbilang lajur, pengendali IN juga boleh digunakan untuk memadankan nilai dalam berbilang lajur; 3. Subquery, Operator IN juga boleh digunakan dengan subquery, iaitu pernyataan pertanyaan yang bersarang dalam pertanyaan utama.

Dalam versi PHP sebelumnya, jika kita tidak mentakrifkan pembolehubah, menggunakannya secara langsung akan mengakibatkan ralat pembolehubah Tidak ditentukan. Walau bagaimanapun, dalam PHP7, kami boleh menggunakan beberapa ciri baharu untuk mengelakkan masalah ini. Ciri baharu ini termasuk dua pengendali baharu: ?-> dan ??. Mereka boleh menyelesaikan dua jenis masalah masing-masing.

Konsep 1. Operator ini digunakan untuk mengendalikan objek dan menyemak sama ada objek itu daripada jenis tertentu (jenis atau jenis antara muka). Format 2. Jika objek yang ditunjuk oleh pembolehubah di sebelah kiri kalkulator ialah objek kelas atau antara muka di sebelah kanan operator, hasilnya adalah benar. (Objectreferencevariable)instanceof(class/interfacetype) instance packagecom.verify_instanceof;publicclassTestInstanceOf{publicstaticvoidmain(String[]args){//Empat baris kod berikut digunakan untuk membuktikan: instanceof

Operator ini hanya digunakan untuk pembolehubah rujukan objek. Operator ini menyemak sama ada objek tergolong dalam jenis tertentu (jenis kelas atau jenis antara muka). Operator instanceof ditulis sebagai -(Objectreferencevariable)instanceof(class/interfacetype) Jika objek yang dirujuk oleh pembolehubah di sebelah kiri operator melepasi semakan IS-A bagi kelas/jenis antara muka di sebelah kanan, hasilnya akan menjadi benar. Berikut ialah contoh - Contoh Demonstrasi Langsung publicclassTest{ publicstaticvoidmain(Stringargs[]){&nbs
