每次面試都會(huì)遇到各種自己從來(lái)沒(méi)想過(guò)的問(wèn)題,這才是面試的難點(diǎn)所在,所以作為面試者應(yīng)該將自己所學(xué)知識(shí)融會(huì)貫通,這樣才會(huì)回答的知其然,知其所以然,我想這才是面試官希望看到的。所以基礎(chǔ)扎實(shí)是多么的重要。
問(wèn)題:typeof能干什么?
回答:判斷基本類型的,比如:Number, Boolean, Undefined, String, Null, 其他的引用類型和Null會(huì)返回object;
問(wèn)題:如果一個(gè)對(duì)象是數(shù)組,應(yīng)該怎么判斷?
回答:用instanceof,比如對(duì)象是arr,用arr instanceof Array,如果返回ture就表示是數(shù)組,為false就不是。
問(wèn)題:那instanceof的原理是什么?
回答:不知道。。。
問(wèn)題:那如果那個(gè)數(shù)組對(duì)象和Object對(duì)象去做運(yùn)算應(yīng)該返回什么呢?
回答:true,因?yàn)镺bject是所有對(duì)象的基類。
到這里這個(gè)問(wèn)題就算是結(jié)束了,面試結(jié)束后我自己在網(wǎng)上查了下,才知道其實(shí)面試官最后問(wèn)的那個(gè)問(wèn)題已經(jīng)是提示了,可我卻。。。。一言難盡。
下面進(jìn)入正題,instanceof的原理是什么?
先看這個(gè)例子:
function Person(name, age){
this.name = name;
this.age = age;
}
function Student(score){
this.score = score;
}
Student.prototype = new Person('李明',22);
var s = new Student(99);
console.log(s instanceof Student); //true
console.log(s instanceof Person); //true
console.log(s instanceof Object); //true
可以看出上面這三個(gè)輸出都為true,這是為什么呢?知道為什么,相信你
已經(jīng)知道原理了。不知道的可以看下面這張圖:
這是關(guān)于上面這個(gè)函數(shù)的原型鏈圖,我們可以看到對(duì)象s有一條屬于自己的原型鏈,然而Student,Person,和Object對(duì)象的原型屬性所指向的原型對(duì)象都在這條原型鏈上,所以答案就出來(lái)了:
檢測(cè)對(duì)象A是不是另一個(gè)對(duì)象B的實(shí)例的原理是:查看對(duì)象B的prototype屬性指向的原型對(duì)象是否在對(duì)象A的原型鏈上,若在則返回true,若不在則返回false。
由答案可以看出,面試官的最后一個(gè)問(wèn)題已經(jīng)是提示了。其實(shí)所有知識(shí)都是聯(lián)通的,明白一個(gè)知識(shí)點(diǎn)肯定有它的用途,你知道原型就應(yīng)該能想到instanceof的查詢過(guò)程就是原型鏈的一個(gè)用途,可如果只是把知識(shí)點(diǎn)單獨(dú)的分隔開(kāi),可能80%的題都回答不上來(lái)。