instanceof原理解析

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。 ​

语法

object instanceof Constructorobject //某个实例对象
Constructor //某个构造函数

实例验证
验证的过程中会使用Object.getPrototypeOf(Object),Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)。

function F1(){}
function F2(){}let f1 = new F1();f1 instanceof F1 //true,因为 Object.getPrototypeOf(f1) === F1.prototype
f1 instanceof F2 //false,因为 F2.prototype 不在 f1 的原型链上f1 instanceof Object; // true,因为 Object.prototype.isPrototypeOf(f1) 返回 true
F1.prototype instanceof Object // true,同上

但 f1 instanceof F1 并不是永远返回 true的。在实例中,function F1(){}创建了一个名为F1的函数,let f1 = new F1()创建了一个名为 f1 的 F1 实例,即 f1 继承 F1。 F1.prototype 指向了一个对象,这个对象在 f1 的原型链上,Object.getPrototypeOf(f1) === F1.prototype可以验证这一点。如果我们修改了 F1.prototype 的值,f1 instanceof F1就可能为 false

F1.prototype = {}
f1 instanceof F1 //false

当 F1.prototype指向了一个空对象,这个空对象就不再存在于 f1 的原型链上了。我们需要明确这一点,f1 instanceof F1 === false并不是因为 F1.prototype为空,而是因为F1.prototype不在 f1 的原型链上。

let f3 = new F1()
f1 instanceof F1 //false
f3 instanceof F1 //true

以此类推,修改f3.proto的值也有异曲同工的效果

f3.__proto__ = {}
f3 instanceof F1 //false

特殊情况

instanceof 左边类型不为 object 的情况
object instanceof constructor,如果左侧不是 object,return false。

1 instanceof Number //falselet a = new Number(1);
a instanceof Number // true

String 对象和 Date 对象都属于 Object 类型和一些特殊情况
String 和 Date 对象 同时也属于 Object 类型(他们是由Object类派生出来的) ​

但是,使用对象文字符号创建的对象在这里是一个例外:虽然原型未定义,但 instanceof Object 返回 true。

var simpleStr = "This is a simple string";
var myString  = new String();
var newStr    = new String("String created with constructor");
var myDate    = new Date();
var myObj     = {};
var myNonObj  = Object.create(null); //一种创建非 Object 实例的对象的方法simpleStr instanceof String; // 返回 false, 非对象实例,因此返回 false
myString  instanceof String; // 返回 true
newStr    instanceof String; // 返回 true
myString  instanceof Object; // 返回 truemyObj instanceof Object;    // 返回 true, 尽管原型没有定义
({})  instanceof Object;    // 返回 true, 同上
myNonObj instanceof Object; // 返回 false, myString instanceof Date; //返回 falsemyDate instanceof Date;     // 返回 true
myDate instanceof Object;   // 返回 true
myDate instanceof String;   // 返回 false

判断自身的情况

使用 instanceof 用于判断对象类型时,以下情况都为 false

Number instanceof Number // false
String instanceof String //false
null instanceof Object // false null不具有任何对象的特性,也没有__proto__属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/203019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读[2023ICME]Edge-FVV: Free Viewpoint Video Streaming by Learning at the Edge

Edge-FVV: Free Viewpoint Video Streaming by Learning at the Edge 会议信息: Published in: 2023 IEEE International Conference on Multimedia and Expo (ICME) 作者: 1 背景 FVV允许观众从多个角度观看视频,但是如果所选视点的视频…

机器学习-逻辑回归

一、引言 逻辑回归(Logistic Regression)是一种广泛应用于分类问题的监督学习算法。尽管名字中含有“回归”二字,但这并不意味着它用于解决回归问题。相反,逻辑回归专注于解决二元或多元分类问题,如邮件是垃圾邮件还是…

vue2+typescript使用高德地图2.0版本

高德地图 webjs api 2.0官网教程 AMap.Driving使用说明 <div class"mmp"><div id"map" ref"mapcontainer"></div></div><script lang"ts"> //安全密钥 window._AMapSecurityConfig{securityJsCode: &qu…

ExoPlayer架构详解与源码分析(10)——H264Reader

系列文章目录 ExoPlayer架构详解与源码分析&#xff08;1&#xff09;——前言 ExoPlayer架构详解与源码分析&#xff08;2&#xff09;——Player ExoPlayer架构详解与源码分析&#xff08;3&#xff09;——Timeline ExoPlayer架构详解与源码分析&#xff08;4&#xff09;—…

数据结构初阶之二叉树性质练习与代码练习

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 Linux 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力,共赴大厂。 目录 1.前言 2.性质练习 3…

基于深度学习的热红外图像超分辨率

基于深度学习的热红外图像超分辨率&#xff08;Infrared Image Super-Resolution&#xff09;是一种利用深度学习技术提高热红外图像空间分辨率的方法。在超分辨率任务中&#xff0c;模型的目标是从低分辨率输入图像生成高分辨率的图像&#xff0c;以提供更多细节和更清晰的图像…

Python中的匿名函数是什么

匿名函数 lambda x , y : xy 1.匿名的目的就是要没有名字&#xff0c;给匿名函数赋给一个名字是没有意义的。 2.匿名函数的参数规则、作用域关系与有名函数是一样的。 3.匿名函数的函数体通常应该是 一个表达式,该表达式必须要有一个返回值。 flambda x,n:x ** n print(f…

我把springboot项目从Java 8 升级 到了Java 17 的过程总结,愿为君提前踩坑!

项目从jdk8升级到jdk17&#xff0c;我不是为了追求java 17的新特性&#xff08;准确来说也还没有去了解有什么新特性&#xff09;&#xff0c;也不是为了准确与时俱进&#xff0c;永远走在java行列的最前端&#xff0c;纯粹因为项目需要&#xff0c;因为我们都知道&#xff0c;…

【C++】:set和map

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下有关多态的知识点&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; C 语 言 专 栏&#xff1a;C语言&#xff1a;从入门到精通 数据结…

SCAUoj综合性实验

Last One ! 文章目录 1109 综合实验&#xff1a;文件操作与字符处理总结 1109 综合实验&#xff1a;文件操作与字符处理 时间限制:4000MS 代码长度限制:10KB 提交次数:6265 通过次数:1646 题型: 填空题 语言: GCC Description 在当前目录中存在文件名为"case1.in"&…

Unity 加载本地或网络图片并转为精灵(Sprite)的方法

有时候我们需要把加载的图片转换成Sprite来使用。 方法&#xff1a; 步骤一&#xff1a;加载本地或网络图片并转换成Texture&#xff0c;这里不再赘述&#xff0c;可参考&#xff1a; Unity 加载本地图片的方法-CSDN博客 Unity 下载网络图片的方法&#xff0c;并把图片赋值…

【二叉树】108.将有序数组转换为二叉搜索树

题目 法1:递归 class Solution {public TreeNode sortedArrayToBST(int[] nums) {if (nums.length 0) {return null;} else if (nums.length 1) {return new TreeNode(nums[0]);}return build(nums, 0, nums.length - 1);}public TreeNode build(int[] nums, int start, i…

Linux-网络服务和端口

域名&#xff1a;便于人们记忆和使用的标识符 www.baidu.com域名解析&#xff1a;将域名转换为与之对应的 IP 地址的过程 nameserver 8.8.8.8ip地址&#xff1a;网络设备的唯一数字标识符 域名ip地址localhost127.0.0.1 网络服务和端口 网络服务端口ftp21ssh22http80https…

深入理解 Java 虚拟机(JVM)从入门到精通

目录 一、JVM内存结构1、堆&#xff08;Heap&#xff09;&#xff08;1&#xff09;特点&#xff08;2&#xff09;堆内存分配&#xff08;3&#xff09;晋升到老年代的方式&#xff08;4&#xff09;堆内存检验方式2、虚拟机栈&#xff08;VM Stack&#xff09;&#xff08;1&…

@property和@property.setter的使用

property的使用 通过使用 property 装饰器&#xff0c;你可以将一个方法转换成一个只读属性&#xff0c;这样在访问这个属性时可以像访问普通##属性一样使用点号&#xff08;.&#xff09;来访问&#xff0c;而不需要通过方法调用 class Circle:def __init__(self, radius):…

OpenHarmony北向-让更广泛的应用开发者更容易参与

一、标准系统的体验 按照官方文档指导&#xff0c;这样操作&#xff0c;OH标准系统开发板就可以运行开发者开发的OpenHarmony应用了。 二、实际情况 按照开发文档上的说明&#xff0c;肯定是装不上的。因为OH不同的发行版&#xff0c;不同发行板不同的设备&#xff0c;IDE&…

uni-app中vue3表单校验失败

目录 1.问题 2.原因及解决方式 3.表单校验方式&#xff08;vue3&#xff09; 1.问题 在app中使用uni-forms表单&#xff0c;并添加校验规则&#xff0c;问题是即使输入内容&#xff0c;表单校验依然失败。 代码&#xff1a; <template><view><uni-forms r…

某个目录忘记添加git过滤了,不小心提交,如何只删除远程提交的目录而不删除本地?

某个目录忘记添加git过滤了&#xff0c;不小心提交&#xff0c;如何只删除远程提交的目录而不删除本地&#xff1f; 举例&#xff1a;今天新建了一个python项目&#xff0c;忘记把 .idea 和 pycache 添加到 .gitignore 文件了&#xff0c;直接推送到远程仓库&#xff0c;这样就…

vue中shift+alt+f格式化防止格式掉其它内容

好处就是使得提交记录干净&#xff0c;否则修改一两行代码&#xff0c;习惯性按了一下格式化快捷键&#xff0c;遍地飘红&#xff0c;下次找修改就费时间 1.点击设置图标-设置 2.点击这个转成配置文件 {"extensions.ignoreRecommendations": true,"[vue]":…

Android Glide自定义AppCompatImageView切分成若干小格子,每个小格子onDraw绘制Bitmap,Kotlin(1)

Android Glide自定义AppCompatImageView切分成若干小格子&#xff0c;每个小格子onDraw绘制Bitmap&#xff0c;Kotlin&#xff08;1&#xff09; 垂直方向的RecyclerView&#xff0c;每行一个AppCompatImageView&#xff0c;每个AppCompatImageView被均匀切割成n个小格子&#…