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

  • 相关阅读:
    MySQL总结
    16 MySQL--正确使用索引
    15 MySQL--索引
    14 MySQL--事务&函数与流程控制
    13 MySQL--存储过程
    12 MySQL--内置功能介绍
    Spring课程 Spring入门篇 4-6 Spring bean装配之基于java的容器注解说明--@ImportResource和@Value java与properties文件交互
    Spring课程 Spring入门篇 4-5 Spring bean装配之基于java的容器注解说明--@Bean
    Spring课程 Spring入门篇 4-4 Spring bean装配(下)之Autowired注解说明3 多选一 qualifier
    Spring课程 Spring入门篇 4-3 Spring bean装配(下)之Autowired注解说明2 集合运用
  • 原文地址:https://www.cnblogs.com/Failbs/p/9674916.html
Copyright © 2011-2022 走看看