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的原型继承

  • 相关阅读:
    Java中Vector和ArrayList的区别
    多线程
    集合框架
    5种运行时异常+1道面试题
    事务,视图,索引,备份和恢复
    MYSQL常用函数
    SQL数据库表字段明细导入导出
    SqlServer 命令方式备份与还原
    .NetCore IIS发布后PUT、DELETE请求错误405.0
    大数据中HBase的Java接口封装
  • 原文地址:https://www.cnblogs.com/Failbs/p/9674916.html
Copyright © 2011-2022 走看看