instanceof 运算符

在JS中我们常用 typeof 运算符来判断一个变量的类型, 在使用 typeof 时如果采用引用类型存储值会出现一个问题,就是无论引用的是什么类型的对象,它返回都是 “object” .

ECMAScript 引用了Java运算符 instanceof 来解决这个问题。

instanceof 跟 typeof 都是用来识别正在处理的对象类型,不同之处是 instanceof 方法要求明确指定对象为某种特定类型对象。

例一:

  var string  = new String('love you');

  string instanceof String;  //输出 true

instanceof 运算符常规用法

例二:

//判断 foo 是否是 Foo 类的实例

  function Foo(){};

  var foo = new Foo();

  foo instanceof Foo;  //输出 true

更重要的一点, instanceof 可以在继承关系中判断一个实例是否属于它的父类型

例三:

  // 判断 foo 是否是 Foo类的实例, 并且是否是其父类型的实例

  function Aoo(){};

  function Foo(){};

  Foo.prototype = new Aoo(){};

  var foo = new Foo();

  foo instanceof Foo;  //输出 true

  foo instanceof Aoo;  //输出 true

instanceof 复杂操作

例四:

  Object instanceof Object  //true

  Function instanceof Function   //true

  Number instanceof Number  //false

  String instanceof String  //false

  Function instanceof Object  //true

  Foo instanceof Function  //true

  Foo instanceof Foo   //false

想要了解上面的奥秘,需要从两方面着手:

  1、语言规范中是如何定义这个运算符的;

  2、JavaScript 原型继承机制

JavaScript instanceof 运算符代码

例六:

function instance_of(L,R){  //L代表左表达式,R代表右表达式
  var W = R.prototype;  //取R的显示原型
  L = L.__proto__;  //取L的隐士原型
  while(true){
    if(L === null){
      return false;
    }
    if(W === L){  //重点,当W严格等于L时,返回true
      return true;
    }
    L = L.__proto__;
  }
}

JavaScript 原型继承机制

本文涉及显示原型和隐式原型,在JavaScript中用 __proto__ 表示对象隐式原型,所有对象都有 __proto__ 属性,但只有Object.prototype.__proto__ 为null。

JavaScript 用prototype 属性表示显示的原型。

原型链图:

 

 讲解 instanceof 复杂算法

例七:  Object instanceof Object

  ObjectR = Object;  //右表达式

  ObjectL = Object;  //左表达式

  //开始推延

  W = ObjectR.prototype = Object.prototype;

  L = ObjectL.__proto__ = Function.prototype;

  //第一次判断

  W != L;

  //循环查找 L 是否还有 __proto__

  L = Function.prototype.__proto__ = Object.prototype;

  //第二次判断

  W === L 

  // 返回 true

 

本文摘自:https://www.ibm.com/developerworks/cn/web/1306_jiangjj_jsinstanceof/

posted @ 2018-07-11 21:15  赛飞  阅读(349)  评论(1编辑  收藏  举报