javascript手写实现instanceof函数 介绍判断数组的方法

news/2024/9/30 2:00:07/

1 手写实现instanceof函数

        instanceof 是 JavaScript 中的一个运算符,用于检测一个对象是否是某个构造函数的实例。它的语法是 object instanceof Constructor,如果 object 是 Constructor.prototype 的一个实例,返回 true,否则返回 false。

简易实现步骤:

  1.  获取到对象__proto__
  2. 如果对象__proto__存在,则判断constuctor的prototype是否和__proto__相等,相等的话函数返回true
  3. 不相等的话继续沿原型链向上查找proto = __proto__
  4. 直到proto为空,返回false
极简版手写instanceof函数

自己实现的出版代码如下,大家自己想想有什么问题?

javascript">const Myinstanceof = (obj, constructor) => {let proto = obj.__proto__while(proto){if(proto === constructor.prototype){return true}proto = proto.__proto__}return false
}
优化版手写instanceof函数

有以下问题:

  • 未检查 obj 是否为对象或函数

  • 未检查 constructor 是否为函数

  • 通过__proto__获得obj原型链上的对象不一定可用,Object.getPrototypeOf 获取 obj 的原型对象是官方给出的方法

修改后的代码如下所示:

javascript">const MyGoinstanceof = (obj, constructor) => {// 检查 obj 是否为对象或函数if (obj == null || (typeof obj !== 'object' && typeof obj !== 'function')) {return false;}// 检查 constructor 是否为函数if (typeof constructor !== 'function') {return false;}let proto = Object.getPrototypeOf(obj);while (proto) {if (proto === constructor.prototype) {return true;}proto = Object.getPrototypeOf(proto);}return false;
}

 测试代码如下所示:

javascript">function test(){
}const obj = new test()
console.log(Myinstanceof(obj, test)) // true
console.log(obj instanceof test) // true
console.log("--------------------")
console.log(Myinstanceof(obj, Object)) // true
console.log(obj instanceof Object) // true
console.log("--------------------")
console.log(Myinstanceof(obj, Array)) // false
console.log(obj instanceof Array) // false
console.log("--------------------")
console.log(Myinstanceof([], Array)) // true
console.log([] instanceof Array) // true
console.log("--------------------")
console.log(Myinstanceof([], Object)) // true
console.log([] instanceof Object) // true
console.log("--------------------")
console.log(MyGoinstanceof(undefined, Object)) // false
console.log(undefined instanceof Object) // false
console.log("--------------------")
console.log(MyGoinstanceof(null, Object)) // false
console.log(null instanceof Object) // false
console.log("--------------------")
console.log(MyGoinstanceof({}, function(){})) // false
console.log({} instanceof function(){}) // false
console.log("--------------------")
console.log(MyGoinstanceof({}, 1)) // TypeError: Right-hand side of 'instanceof' is not callable

2 判断数组的方法

  1.  使用Array.prototype.isArray() Array类上的静态方法。
  2.  使用1中提到的instanceof方法 instanceof Array。
  3.  使用对象上的constructor方法判断,其指向构造函数 arr.constuctor === Array。
  4. 使用Object.prototype.toString.call(array) 判断是否等于字符串"[object Array]"

四种实现方式代码验证如下所示:

javascript">// 判断数组的方法
// Array.isArray
const arr = []
console.log(Array.isArray(arr)) 
// instanceof Array
console.log(arr instanceof Array)
// constructor
console.log(arr.constructor === Array)
// Object.prototype.toString.call
console.log(Object.prototype.toString.call(arr) === '[object Array]')

http://www.ppmy.cn/news/1532189.html

相关文章

LSTM预测未来30天销售额

加入深度实战社区:www.zzgcz.com,免费学习所有深度学习实战项目。 1. 项目简介 本项目旨在利用深度学习中的长短期记忆网络(LSTM)来预测未来30天的销售额。LSTM模型能够处理时序数据中的长期依赖问题,因此在销售额预测这类涉及时…

k8s_资源管理介绍

资源管理介绍 在k8s中,所有内容都抽象成资源,用户需要通过操作资源来管理k8s k8s本身就是一个集群系统,用户可以在集群中部署服务,在k8s集群中运行一个个的容器,将指定的程序部署到容器中 k8s最小的管理单元是pod&…

【.NET 8 实战--孢子记账--从单体到微服务】--用户(删除/修改/查询)

本文将继续讲解和用户相关的接口,包括用户的删除、修改和查询 一、需求 我们先来看一下这篇文章的目标也就是需求表: 编号需求标题需求内容1删除对某一个用户进行删除,注意:只能删除用户,和用户相关联的数据不能删除…

【C语言内存管理】第七章 内存管理中的常见问题

第七章 内存管理中的常见问题 内存管理是C语言编程中的一个关键环节,错误的内存操作容易导致严重的程序漏洞和系统崩溃问题。以下详细讨论内存管理中的常见问题,并提供相应的代码示例和预防方法。 1. 内存泄漏 内存泄漏是指程序在堆上分配内存后&…

「OC」探索 KVC 的基础与应用

「OC」KVC的初步学习 文章目录 「OC」KVC的初步学习前言介绍KVC的相关方法key和keyPath的区别KVC的工作原理KVO的setValue:forKey原理KVO的ValueforKey原理 在集合之中KVC的用法1. mutableArrayValueForKey: 和 mutableArrayValueForKeyPath:2. mutableSetValueForKey: 和 muta…

小程序振动

原生小程序: (1):震动 wx.vibrate(); (2):长震动 wx.vibrateLong(); (3):短震动 wx.vibrateShort(); uniapp: (1):震动 uni.vibrate(); (2):长震动 uni.vibrateLong(); (3):…

华为认证HCIA篇--网络通信基础

大家好呀!我是reload。今天来带大家学习一下华为认证ia篇的网络通信基础部分,偏重一些基础的认识和概念性的东西。如果对网络通信熟悉的小伙伴可以选择跳过,如果是新手或小白的话建议还是看一看,先有个印象,好为后续的…

数据集-目标检测系列-吸烟检测数据集 smoking cigarette >> DataBall

数据集-目标检测系列-吸烟检测数据集 smoking cigarette >> DataBall 数据集-目标检测系列-吸烟检测数据集 (smoking cigarette) 数据量:1W 数据项目地址: gitcode: https://gitcode.com/DataBall/DataBall-detections-…