【重温基础】instanceof运算符
最近开始在整理ES6/ES7/ES8/ES9的知识点(已经上传到 我的博客 上),碰到一些知识点是自己已经忘记(用得少的知识点),于是也重新复习了一遍。
这篇文章要复习的 instanceof 是我在整理过程中遇到的,那就整理下来吧,不然容易忘记。
要是哪里写得不妥,欢迎各位大佬指点。
1.定义
instanceof运算符用于测试构造函数的prototype属性是否出现在对象的原型链中的任何位置。 —— MDN
简单理解为:instanceof可以检测一个实例是否属于某种类型。
比如:
function F (){
    // ...
}
let a = new F ();
a instanceof F;      // true
a instanceof Object; // true  后面介绍原因
还可以在继承关系中用来判断一个实例是否属于它的父类型。
比如:
function F (){};
function G (){};
function Q (){};
G.prototype = new F();   // 继承
let a = new G();
a instanceof F;      // true
a instanceof G;      // true
a instanceof Q;      // false
2.使用方法
语法为: object instanceof constructor。
- object: 需要测试的函数
- constructor: 构造函数
即:用instanceof运算符来检测constructor.prototype 是否存在参数object的原型链。
function F (){};
function G (){};
let a = new F ();
a instanceof F;      // true  因为:Object.getPrototypeOf(a) === F.prototype
a instanceof Q;      // false 因为:F.prototype不在a的原型链上
a instanceof Object; // true  因为:Object.prototype.isPrototypeOf(a)返回true
F.prototype instanceof Object;  // true,同上
注意:
- a instanceof F返回- true以后,不一定永远都都返回为- true,- F.prototype属性的值有可能会改变。
- 原表达式a的值也会改变,比如a.__proto__ = {}之后,a instanceof F就会返回false了。
检测对象是不是特定构造函数的实例:
// 正确
if (!(obj instanceof F)) {
  // ...
}
// 错误 因为
if (!obj instanceof F);  // 永远返回false
// 因为 !obj 在instanceof之前被处理 , 即一直使用一个布尔值检测是否是F的实例
3.实现instanceof
/**
* 实现instanceof
* @param obj{Object} 需要测试的对象
* @param fun{Function} 构造函数
*/
function _instanceof(obj, fun) {
    let f = fun.prototype;   // 取B的显示原型
    obj = obj.__proto__;       // 取A的隐式原型
    while (true) {
        //Object.prototype.__proto__ === null
        if (obj === null)
            return false;
        if (f === obj)        // 这里重点:当 f 严格等于 obj 时,返回 true
            return true;
        obj = obj.__proto__;
    }
}
4.instanceof 与 typeof 对比
相同:
instanceof和typeof都能用来判断一个变量的类型。
区别:
instanceof 只能用来判断对象、函数和数组,不能用来判断字符串和数字等:
let a = {};
let b = function () {};
let c = [];
let d = 'hi';
let e = 123;
a instanceof Object;  // true
b instanceof Object;  // true
c instanceof Array;   // true
d instanceof String;  // false
e instanceof Number;  // false
typeof :用于判断一个表达式的原始值,返回一个字符串。
typeof 42;         // "number"
typeof 'blubber';  // "string"
typeof true;       // "boolean"
typeof aa;         // "undefined"
一般返回结果有:
- number
- boolean
- string
- function(函数)
- object(NULL,数组,对象)
- undefined。
判断变量是否存在:
不能使用:
if(a){
    //变量存在
}
// Uncaught ReferenceError: a is not defined
原因是如果变量未定义,就会报未定义的错,而应该使用:
if(typeof a != 'undefined'){
    //变量存在
}
5.参考资料

【重温基础】instanceof运算符的更多相关文章
- Java基础——Instanceof 运算符
		Instanceof 运算符 java 中的instanceof 运算符是用来在运行时指出对象是否为特定类的一个实例 instanceof运算返回值:boolean类型 用法 boolean resu ... 
- 《Java基础知识》Java instanceof 运算符
		java多态性带来一个问题,就是如何判断一个变量所实际引用对象的类型.这里java帮我们引入了 instanceof 运算符. instanceof运算符用来判断一个变量的所引用对象的实际类型,注意是 ... 
- JavaScript instanceof 运算符深入剖析
		简介: 随着 web 的发展,越来越多的产品功能都放在前端进行实现,增强用户体验.而前端开发的主要语言则是 JavaScript.学好 JavaScript 对开发前端应用已经越来越重要.在开发复杂产 ... 
- JavaScript instanceof 运算符深入剖析【转载】
		http://www.ibm.com/developerworks/cn/web/1306_jiangjj_jsinstanceof/ instanceof 运算符简介 在 JavaScript ... 
- instanceof 运算符简介
		文章摘自: http://www.ibm.com/developerworks/cn/web/1306_jiangjj_jsinstanceof/ https://developer.mozilla. ... 
- 【重温基础】15.JS对象介绍
		从这篇文章开始,复习 MDN 中级教程 的内容了,在初级教程中,我和大家分享了一些比较简单基础的知识点,并放在我的 [Cute-JavaScript]系列文章中. 关于[Cute-JavaScript ... 
- instanceof 运算符
		java中的instanceof=======>二元运算符 用法: result = object instanceof class 参数: result 是boolean类型 object 是 ... 
- instanceof运算符
		instanceof运算符:判断该对象是否是某一个类的实例. 语法格式:boolean b = 对象A instanceof 类B://判断A对象是否是B类的实例,如果是返回true. 若对象是类的实 ... 
- Object.prototype 与 Function.prototype 与 instanceof 运算符
		方法: hasOwnProperty isPrototypeOf propertyIsEnumerable hasOwnProperty 该方法用来判断一个对象中的某一个属性是否是自己提供的( 住要用 ... 
随机推荐
- 做HTML静态页面时遇到的问题总结
			1. 如果所示,问题:“首页”和“闲置”文字部分位于table中部 解决方法:需要取消vertical-align:middle属性,将其设置为vertical-align:top,并将文本的高度改为 ... 
- Kali Rolling 系统配置总结 (Updateing)
			主系统Kali Linux确实好用,继<Kali~2018安装后的配置>之后,自己又全面详细的总结了关于Kali Linux系统安装后的配置,<Kali Rolling 系统配置总结 ... 
- 调用RESTful GET方法
			package restclient; import java.io.BufferedReader; import java.io.IOException; import java.io.InputS ... 
- 如何使用Sping Data JPA更新局部字段
			问题描述 在更新数据时,有时候我们只需要更新一部分字段,其他字段保持不变.Spring Data JPA并未提供现成的接口,直接使用save()更新会导致其他字段被Null覆盖掉. 解决办法 通常有两 ... 
- 理解Redis持久化
			本文首发于:https://mp.weixin.qq.com/s/WVUGWuNrGoyY_7aDf7NNmA 微信公众号:后端技术指南针 0.前言 通俗讲持久化就是将内存中的数据写入非易失介质中,比 ... 
- uwsgi启动报错 chdir(): No such file or directory [core/uwsgi.c line 2591]
			今天在使用 uwsgi --ini uwsgi.ini 命令时总说找不到我的项目路径,可是我的路径是绝对没有问题的 解决方法: 把你的uwgis.ini文件里的全部注释删除,再运行uwsgi 启动成功 ... 
- Python3 之 类属性与实例属性
			1.类属性与实例属性 类属性就相当与全局变量,实例对象共有的属性,实例对象的属性为实例对象自己私有. 类属性就是类对象(Tool)所拥有的属性,它被所有类对象的实例对象(实例方法)所共有,在内存中只存 ... 
- scss--函数 (Functions)--unit
			(Sass::Script::Value::String) unit($number) Returns the unit(s) associated with a number. Complex un ... 
- Java入门系列之集合HashMap源码分析(十四)
			前言 我们知道在Java 8中对于HashMap引入了红黑树从而提高操作性能,由于在上一节我们已经通过图解方式分析了红黑树原理,所以在接下来我们将更多精力投入到解析原理而不是算法本身,HashMap在 ... 
- linux服务器cpu信息查看详解
			在linux系统中,提供了/proc目录下文件,显示系统的软硬件信息.如果想了解系统中CPU的提供商和相关配置信息,则可以查/proc/cpuinfo.但是此文件输出项较多,不易理解.例如我们想获取, ... 
