前言
最近由于疫情影响,Sarah还没回家。
现在还在奶奶家,村里还不让我回去因为我家属于重灾区。每天要照顾奶奶炒的菜是越来越好吃了。
今天记录instanceof的用法。
instanceof运算符的原理
我们经常看到类似cat instanceof Animal
等语句,拿这个例子来讲,如果返回true就说明cat是Animal的实例,或者是祖先的实例对象。
也可以这么说,这个运算符的作用主要是检测cat的原型对象是否在Animal的原型链上面。
借用一下木易杨大佬的图
会跟着cat的proto属性去遍历原型链,寻找到和Animal.prototype相等的原型对象就返回true。这个例子中遍历了两次后返回true。
instanceof的实现
现在实现一个instanceof
实现:
var new_instanceof=function(leftvalue, rightvalue) {
leftvalue=leftvalue.__proto__;
rightvalue=rightvalue.prototype;
while(true){
if(leftvalue==null){
return false;
}else if(leftvalue==rightvalue){
return true;
}else{
leftvalue=leftvalue.__proto__;
}
}
}
测试:
var Person=function(){
// name=this.name,
// age=this.age
}
var yyPerson= function () {
// sex: this.sex
};
yyPerson.prototype=new Person();
yyPerson.prototype.constructor=yyPerson;
var linglong=new yyPerson();
console.log(linglong instanceof yyPerson);
console.log(linglong instanceof Person);
console.log(new_instanceof(linglong,Person));
测试结果返回三true,符合逻辑。写的时候创建构造函数的时候我写成了对象的形式一直报错,老糊涂了哈哈哈
三种方法判断数组方法的比较
instanceof
- instanceof 的内部机制是通过判断对象的原型链中是不是能找到类型的 prototype。
- 使用 instanceof判断一个对象是否为数组,instanceof 会判断这个对象的原型链上是否会找到对应的 Array 的原型,找到返回 true,否则返回 false。
- 但 instanceof 只能用来判断对象类型,原始类型不可以。并且所有对象类型 instanceof Object 都是 true
isArray()
- 当检测Array实例时,Array.isArray 优于 instanceof ,因为 Array.isArray 可以检测出 iframes
- Array.isArray()是ES6新增的方法,当不存在 Array.isArray() ,可以用 Object.prototype.toString.call() 实现。
Array.prototype.toString.call()
这种方法对于所有基本的数据类型都能进行判断,即使是 null 和 undefined 。