【011】instanceof的实现+三种判断数组的方法

本文探讨了JavaScript的instanceof运算符的工作原理,介绍了如何实现instanceof,并比较了三种判断数组的方法:instanceof、Array.isArray()以及使用Array.prototype.toString.call()。文章指出,虽然instanceof可以检测对象类型,但Array.isArray()在处理Array实例时更为精确,且适用于跨iframe场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近由于疫情影响,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 。

参考:

【进阶5-2期】图解原型链及其继承优缺点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值