instanceof原理解析

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

语法

object instanceof Constructor

object //某个实例对象
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 //false

let 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; // 返回 true

myObj instanceof Object;    // 返回 true, 尽管原型没有定义
({
   })  instanceof Object;    // 返回 true, 同上
myNonObj instanceof Object; // 返回 false, 

myString instanceof Date; //返回 false

myDate 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__属性

相关推荐

  1. instanceof理解

    2023-12-10 20:38:01       30 阅读
  2. MongoDB理解

    2023-12-10 20:38:01       22 阅读
  3. ByteTrack算法理解

    2023-12-10 20:38:01       24 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-10 20:38:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-10 20:38:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-10 20:38:01       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-10 20:38:01       20 阅读

热门阅读

  1. MetricBeat监控Redis

    2023-12-10 20:38:01       39 阅读
  2. 【C语言实现windows环境下Socket编程TCP/IP协议】

    2023-12-10 20:38:01       42 阅读
  3. ip查寻

    2023-12-10 20:38:01       38 阅读
  4. Springcolud微服务的使用

    2023-12-10 20:38:01       34 阅读