每次面试都会遇到各种自己从来没想过的问题,这才是面试的难点所在,所以作为面试者应该将自己所学知识融会贯通,这样才会回答的知其然,知其所以然,我想这才是面试官希望看到的。所以基础扎实是多么的重要。
问题:typeof能干什么?
回答:判断基本类型的,比如:Number, Boolean, Undefined, String, Null, 其他的引用类型和Null会返回object;
问题:如果一个对象是数组,应该怎么判断?
回答:用instanceof,比如对象是arr,用arr instanceof Array,如果返回ture就表示是数组,为false就不是。
问题:那instanceof的原理是什么?
回答:不知道。。。
问题:那如果那个数组对象和Object对象去做运算应该返回什么呢?
回答:true,因为Object是所有对象的基类。
到这里这个问题就算是结束了,面试结束后我自己在网上查了下,才知道其实面试官最后问的那个问题已经是提示了,可我却。。。。一言难尽。
下面进入正题,instanceof的原理是什么?
先看这个例子:
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
可以看出上面这三个输出都为true,这是为什么呢?知道为什么,相信你
已经知道原理了。不知道的可以看下面这张图:
这是关于上面这个函数的原型链图,我们可以看到对象s有一条属于自己的原型链,然而Student,Person,和Object对象的原型属性所指向的原型对象都在这条原型链上,所以答案就出来了:
检测对象A是不是另一个对象B的实例的原理是:查看对象B的prototype属性指向的原型对象是否在对象A的原型链上,若在则返回true,若不在则返回false。
由答案可以看出,面试官的最后一个问题已经是提示了。其实所有知识都是联通的,明白一个知识点肯定有它的用途,你知道原型就应该能想到instanceof的查询过程就是原型链的一个用途,可如果只是把知识点单独的分隔开,可能80%的题都回答不上来。