当前位置: 首页 > 编程笔记 >

实例讲解JavaScript中instanceof运算符的用法

阎啸
2023-03-14
本文向大家介绍实例讲解JavaScript中instanceof运算符的用法,包括了实例讲解JavaScript中instanceof运算符的用法的使用技巧和注意事项,需要的朋友参考一下

instanceof 运算符简介

在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”。ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题。instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型。与 typeof 方法不同的是,instanceof 方法要求开发者明确地确认对象为某特定类型。例如:

清单 1. instanceof 示例

 var oStringObject = new String("hello world"); 
 console.log(oStringObject instanceof String); // 输出 "true"

这段代码问的是“变量 oStringObject 是否为 String 对象的实例?”oStringObject 的确是 String 对象的实例,因此结果是”true”。尽管不像 typeof 方法那样灵活,但是在 typeof 方法返回 “object” 的情况下,instanceof 方法还是很有用的。

instanceof 运算符的常规用法:

通常来讲,使用 instanceof 就是判断一个实例是否属于某种类型。例如:

清单 2. instanceof 常规用法

 // 判断 foo 是否是 Foo 类的实例
 function Foo(){} 
 var foo = new Foo(); 
 console.log(foo instanceof Foo)//true

另外,更重的一点是 instanceof 可以在继承关系中用来判断一个实例是否属于它的父类型。例如:

清单 3. instanceof 在继承中关系中的用法

 // 判断 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

上面的代码中是判断了一层继承关系中的父类,在多层继承关系中,instanceof 运算符同样适用。

你真的了解 instanceof 操作符吗?

看了上面的代码示例,是不是觉得 instanceof 操作符很简单,下面来看点复杂的用法。

清单 4. instanceof 复杂用法

 console.log(Object instanceof Object);//true 
 console.log(Function instanceof Function);//true 
 console.log(Number instanceof Number);//false 
 console.log(String instanceof String);//false 
 
 console.log(Function instanceof Object);//true 
 
 console.log(Foo instanceof Function);//true 
 console.log(Foo instanceof Foo);//false

看了上面的代码是不是又晕头转向了?为什么 Object 和 Function instanceof 自己等于 true,而其他类 instanceof 自己却又不等于 true 呢?如何解释?要想从根本上了解 instanceof 的奥秘,需要从两个方面着手:1,语言规范中是如何定义这个运算符的。2,JavaScript 原型继承机制。

清单 5. 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__; 
 } 
 }

清单 6. 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

清单 7. Function instanceof Function

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

清单 8. 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

简析 instanceof 在 Dojo 继承机制中的应用

在 JavaScript 中,是没有多重继承这个概念的,就像 Java 一样。但在 Dojo 中使用 declare 声明类时,是允许继承自多个类的。下面以 Dojo 1.6.1 为例。

清单 9. Dojo 中多重继承

 dojo.declare("Aoo",null,{}); 
 dojo.declare("Boo",null,{}); 
 dojo.declare("Foo",[Aoo,Boo],{}); 
 
 var foo = new Foo(); 
 console.log(foo instanceof Aoo);//true 
 console.log(foo instanceof Boo);//false 
 
 console.log(foo.isInstanceOf(Aoo));//true 
 console.log(foo.isInstanceOf(Boo));//true

上面的示例中,Foo 同时继承自 Aoo 和 Boo,但当使用 instanceof 运算符来检查 foo 是否是 Boo 的实例时,返回的是 false。实际上,在 Dojo 的内部,Foo 仍然只继承自 Aoo,而通过 mixin 机制把 Boo 类中的方法和属性拷贝到 Foo 中,所以当用 instanceof 运算符来检查是否是 Boo 的实例时,会返回 false。所以 Dojo 为每个类的实例添加了一个新的方法叫 isInstanceOf,用这个方法来检查多重继承。

 类似资料:
  • 本文向大家介绍举例讲解Python中的算数运算符的用法,包括了举例讲解Python中的算数运算符的用法的使用技巧和注意事项,需要的朋友参考一下 下表列出了所有Python语言支持的算术运算符。假设变量a持有10和变量b持有20,则:  例子: 试试下面的例子就明白了所有的Python编程语言提供了算术运算符: #!/usr/bin/python a = 21 b = 10 c = 0 c = a

  • 问题内容: 是否有可以与运算符一起使用的有效的类Type变量?例如: 作为替代方案: 会有性能上的好处吗? 问题答案: 你在做什么实际上是不一样的。考虑一下子类会发生什么(我知道您不能子类,所以在这种情况下不要紧)。 如果您有一个对象,并且想知道它是否是某种类型的实例,并且您有该对象,则可以使用该方法。 无论哪种情况,我都希望性能差异不大。

  • 本文向大家介绍javascript中join方法实例讲解,包括了javascript中join方法实例讲解的使用技巧和注意事项,需要的朋友参考一下 我们先来看一下Array.join()函数的基本语法 separator表示用于分隔数组的每个元素的字符串。如果保留默认数组元素,请用逗号(,)分隔。 此函数返回通过使用分隔符连接数组的所有元素而创建的字符串。如果未提供分隔符,则使用逗号(,)连接数组

  • 问题内容: 在JavaScript中的关键字可能会相当混乱首次遇到它的时候,人们往往会认为JavaScript是不是面向对象的编程语言。 它是什么? 它解决什么问题? 什么时候合适,什么时候不合适? 问题答案: 左侧(LHS)操作数是要测试到右侧(RHS)操作数的实际对象,右侧对象是类的实际构造函数。基本定义是: 这是直接从Mozilla开发人员网站获取的示例: 值得一提的是,如果对象继承自类的原

  • 问题内容: 运算符是做什么用的?我看过类似的东西 但是,这对我来说都没有意义。我已经完成了研究,但只提出了没有任何解释的示例。 问题答案: 是用于测试对象(实例)是否为给定Type的子类型的二进制运算符。 想像: 然而,随着;, 因为是的超类型,可能较少。 和, 这是因为Dog既不是的子类型也不是的父类型Cat,并且它也不实现它。 请注意,上面用于的变量是类型。这是一个运行时操作,将我们带到一个用

  • 问题内容: 整个泛型问题有点让我陷入困境,RTT更是如此。 规范?嗯,这是要点: 然后我会这样称呼它: 这样一来,我便可以在实际的帮助程序中灵活地分配查询返回类型。它进行一些转换和对象创建。我看到的是没有匹配项,我应该以其他方式这样做吗?还是整个想法不好? 真正的核心是我不了解class.isInstance和instanceOf运算符之间的区别?我应该使用后者吗? 问题答案: 这样一来,我便可以

  • DFS(深度优先搜索)是一种常见的算法,我们平时遇到的大部分题目都可以用 DFS 解决,但是一般情况下,这都是骗分算法,很少会有爆搜为正解的题目。因为 DFS 的时间复杂度特别高。 一、定义 DFS(深度优先搜索)定义上的深度优先搜索的思路与树的先序遍历非常相似,是针对图的搜索而提出的一种算法,下面是算法导论上的解释: 在深度优先搜索中,对于最新发现的顶点,如果它还有以此为顶点而未探测到的边,就沿

  • 本文向大家介绍JavaScript事件方法(实例讲解),包括了JavaScript事件方法(实例讲解)的使用技巧和注意事项,需要的朋友参考一下 废话不多说,直接上代码 以上这篇JavaScript事件方法(实例讲解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。