现在有一些面试题会让你手写这个instanceof
首先要了解一下instanceof是什么
它是一个运算符
a instanceof B : a对象的原型链上有没有B构造函数的原型

原型链又是一个什么样的情况呢?
有这样一段代码,它的原型链情况是这样的

function A() { }
const a = new A();// a.__proto__ === A.prototype
// A.prototype.__proto__ === Object.prototype
// Object.prototype.__proto__ === null

这是比较简单的原型链,有了一定知识之后呢,我们就可以手写出instanceof

function instanceOf(obj, Constructor) {if (typeof Constructor !== "function" || typeof obj !== "object") {return false;}const prototype = Constructor.prototype; // 找原型while (obj !== null) {if (obj === prototype) {return true;}obj = obj.__proto__;}return false;
}

这里还需要去看这个函数是否是箭头函数了,大家也都清楚箭头函数没有原型
以下是测试代码

function A() { }
const a = new A();console.log(a instanceof A); // true
console.log(a instanceof Object); // trueconsole.log(instanceOf(a, A)); // true
console.log(instanceOf(a, Object)); // true
console.log(instanceOf(a, function () { })); // false
console.log(instanceOf([],Array)); // true
console.log(instanceOf([],Object)); // true

数组的原型链

arr.__proto__ === Array.prototype
Array.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null

函数的原型链
函数是一等公民,也是一个对象,既有隐式原型,又有原型。

const func = function () {};
func.__proto__ = Function.prototype
Function.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null

并非所有对象的原型链上都有Object的原型

const obj = Object.create(null); // obj.__proto__ = null

手写instanceof相关推荐

  1. 手写 instanceof 方法

    语法 object instanceof constructor 参数 object 某个实例对象 constructor 某个构造函数 描述 instanceof 运算符用来检测 construct ...

  2. instanceof原理--手写代码实现

    手写instanceof 首先在写之前要先理解一下instanceof的实现原理: instanceof 主要的实现原理就是只要右边变量的prototype在左边变量的原型链上即可(也就是说左边的变量 ...

  3. JavaScript进阶必会的手写功能

    JavaScript进阶的必要性 无论是学习react还是vue,它们都是js的应用框架.剥去他们的壳子看到的始终是js,所以作为一个前端大厨必须要熟练掌握好js这个大勺,才能烧出一顿好菜 无论是自我 ...

  4. 【面试题】常见面试题汇总————手写题

    面试中出现的经典题 方法类 数组去重排序 数组去重 数组排序 数组拍平,降维 判断一个数组是不是数组 二级目录 lc编程类 全排列 js实现类 手写promise 手写then 手写instanceo ...

  5. 2022必会的前端面试手写题

    前端面试题视频讲解 将数字每千分位用逗号隔开 数字有小数版本: let format = n => {let num = n.toString() // 转成字符串let decimals = ...

  6. 前端面试之手写代码篇

    手写代码 1.手写instanceof方法 2.手写new操作符 3.手写Promise.all() 4.手写防抖函数 5.手写节流函数 6.手写call.apply函数 7.手写bind函数 8.封 ...

  7. 前端面试题之手写代码篇

    原文地址:前端面试题之手写代码篇 git地址:https://gitee.com/AiShiYuShiJiePingXing/lovebetterworld 点击前往GIT 一.JavaScript ...

  8. 前端面试手写题汇总大全(含答案)-- 持续更新

    高频 一. 柯里化函数(Currying)和反柯里化 简介 柯里化(Currying),又称部分求值(Partial Evaluation),是把接受多个参数的函数变换成接受一个单一参数(最初函数的第 ...

  9. 前端常见手写面试题合集

    实现一个函数判断数据类型 function getType(obj) {if (obj === null) return String(obj);return typeof obj === 'obje ...

  10. 【干货】JDK动态代理的实现原理以及如何手写一个JDK动态代理

    动态代理 代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 在解 ...

最新文章

  1. 开发可统计单词个数的Android驱动程序(2)
  2. MXD文档保存和地图浏览
  3. 用lucene实现在一个(或者多个)字段中查找多个关键字
  4. 那一年,爱因斯坦输得很惨很惨,被十几个诺奖得主怼了一遍后,退出了群聊……...
  5. centos7配置jdk1.8环境变量
  6. html5 audio 获取播放时间,html5 audio 延时获取播放路径播放失败
  7. ap计算机科学a买什么书,准备AP*计算机科学A考试-第1部分
  8. 关于 RGB 的颜色认知
  9. Spring mvc配置文件
  10. hnu小学期实训之数圈
  11. Python补充之函数
  12. mysql简单命令行操作以及环境变量的配置
  13. 尚硅谷Docker---docker安装及简介
  14. 软件概要设计文档编写
  15. PCL单选点和框选点
  16. 最简单的51单片机软件定时器的编写
  17. 【技术思路】极客时间-左耳听风-开篇词1
  18. (几何方面:正六边形面积)编写一个程序,提示用户输入正六边形的边长并显示它的面积。
  19. 壹连科技冲刺深交所:年营收14亿 65%收入来自宁德时代
  20. 浅谈spring之IoC控制反转

热门文章

  1. 微服务网关Spring Cloud Gateway
  2. 用Poedit翻译wordpress主题或插件的步骤
  3. jsmind(Jsmind数据格式)
  4. 3dmax2020卸载/安装失败/如何彻底卸载清除干净3dmax2020注册表和文件的方法
  5. 广播系统可以跨服务器控制吗,数字广播系统技术参数和要求.doc
  6. Redis 过期策略和内存淘汰机制
  7. 【转载】怎样编写CSS?
  8. java 柱状图 宽度_Java 创建Excel图表
  9. android 读写txt文件,Android:将文本写入txt
  10. arcgis注册数据源_将表注册到地理数据库