zoukankan      html  css  js  c++  java
  • JavaScript instanceof 运算符

    instanceof运算符简介

    在 JavaScript 中

    判断一个变量的类型常常会用 typeof 运算符

    判断一个实例是否属于某种类型会使用instanceof

    与 typeof 方法不同的是,instanceof 方法要求开发者明确地确认对象为某特定类型。

    常规用法

    var oStringObject = new String("hello world"); 
    console.log(oStringObject instanceof String);   // 输出 "true"
    
    // 判断 foo 是否是 Foo 类的实例
    function Foo(){} 
    var foo = new Foo(); 
    console.log(foo instanceof Foo)//true

    继承关系中的用法

    // 判断 foo 是否是 Foo 类的实例 , 并且是否是其父类型的实例,多层继承同样适用
    function Aoo(){} 
    function Foo(){} 
    Foo.prototype = new Aoo();//JavaScript 原型继承
     
    var foo = new Foo(); 
    console.log(foo instanceof Foo)//true 
    console.log(foo instanceof Aoo)//true

    复杂用法

     1 console.log(Function instanceof Function) // true
     2 console.log(Object instanceof Object); // true
     3 console.log(Function instanceof Object); // true
     4 console.log(Object instanceof Function); // true
     5 console.log(Function instanceof String); // false
     6 console.log(String instanceof Object); // true
     7 console.log(String instanceof Function); // true
     8 console.log(String instanceof Number); // false
     9 console.log(Array instanceof Number); // false
    10 console.log(Number instanceof Array); // false
    11 console.log(String instanceof Array); // false
    12 console.log(Array instanceof Object); // true
    13 console.log(Array instanceof Function); // true

    instanceof的定义

    JavaScript instanceof 运算符的定义用代码实现

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

    讲解 instanceof 复杂用法

    有了上面 instanceof 运算符的 JavaScript 代码和原型继承图,再来理解 instanceof 运算符将易如反掌。下面将详细讲解 Object instanceof Object,Function instanceof Function 和 Foo instanceof Foo 三个示例,其它示例读者可自行推演。

    Object instanceof Object

    // 为了方便表述,首先区分左侧表达式和右侧表达式
    ObjectL = Object, ObjectR = Object; 
    // 下面根据规范逐步推演
    O = ObjectR.prototype = Object.prototype 
    L = ObjectL.__proto__ = Function.prototype 
    // 第一次判断
    O != L 
    // 循环查找 L 是否还有 __proto__ 
    L = Function.prototype.__proto__ = Object.prototype 
    // 第二次判断
    O == L 
    // 返回 true

    Function instanceof Function

    // 为了方便表述,首先区分左侧表达式和右侧表达式
    FunctionL = Function, FunctionR = Function; 
    // 下面根据规范逐步推演
    O = FunctionR.prototype = Function.prototype 
    L = FunctionL.__proto__ = Function.prototype 
    // 第一次判断
    O == L 
    // 返回 true

    Foo instanceof Foo

    // 为了方便表述,首先区分左侧表达式和右侧表达式
    FooL = Foo, FooR = Foo; 
    // 下面根据规范逐步推演
    O = FooR.prototype = Foo.prototype 
    L = FooL.__proto__ = Function.prototype 
    // 第一次判断
    O != L 
    // 循环再次查找 L 是否还有 __proto__ 
    L = Function.prototype.__proto__ = Object.prototype 
    // 第二次判断
    O != L 
    // 再次循环查找 L 是否还有 __proto__ 
    L = Object.prototype.__proto__ = null 
    // 第三次判断
    L == null 
    // 返回 false

    下篇文章将介绍JavaScript的原型继承

  • 相关阅读:
    第60天Shader法线贴图、切线空间
    第59天Shader基本光照模型、漫反射光照算法、光照计算、高光、灰度图实现
    第58天shader混合命令、颜色运算、顶点/片元着色、属性类型、语义、坐标空间、Unity内置矩阵、纹理采样、Cg函数
    第57天shader基本结构、渲染队列、裁剪、深度写入
    第55天XLua实现背包
    第54天XLua插件使用(续)
    第53天XLua插件使用
    第52天-lua语言基础语法
    第51天-AssetBundle(AB包)
    第50天-背包实例(三)
  • 原文地址:https://www.cnblogs.com/Failbs/p/9674916.html
Copyright © 2011-2022 走看看