首页  >  文章  >  web前端  >  为什么字符串、布尔值和数字文字无法通过“instanceof”测试?

为什么字符串、布尔值和数字文字无法通过“instanceof”测试?

Patricia Arquette
Patricia Arquette原创
2024-10-31 21:51:02546浏览

Why Do String, Boolean, and Number Literals Fail the `instanceof` Test?

Instanceof 难题:为什么有些文字无法匹配

尽管是 JavaScript 的基础,但实例化运算符在与某些特定对象一起使用时可能会表现出令人费解的行为文字。值得注意的是,字符串、布尔值和数字文字在针对各自的构造函数进行测试时都计算为 false。

<code class="js">"foo" instanceof String //=> false
"foo" instanceof Object //=> false

true instanceof Boolean //=> false
true instanceof Object //=> false
false instanceof Boolean //=> false
false instanceof Object //=> false

12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true</code>

这种行为令人惊讶,因为人们会期望文字是其相应类型的实例。然而,它们不一致的原因在于基元和对象之间的区别。

游戏中的原始主义

JavaScript 基元,例如字符串、数字和布尔值,是不是通过对象构造函数创建的内置类型。相反,它们与 JavaScript 中构造的对象有着根本的不同。

<code class="js">var color1 = new String("green");
color1 instanceof String; // returns true
var color2 = "coral";
color2 instanceof String; // returns false (color2 is not a String object)</code>

如上所示,使用 String 构造函数创建一个 String 对象,在使用 instanceof 测试时,该对象的计算结果将为 true。然而,原始字符串文字“coral”不会继承此行为。

替代类型检查方法

带有原语的instanceof的令人费解的行为导致了采用类型检查的替代方法:

  • typeof 运算符: typeof 运算符返回变量的原始类型,例如 typeof "foo" === "string"。
  • Object.prototype.toString: 此方法也可用于类型检查,例如 Object.prototype.toString.call("foo") === "[object String ]".

总之,instanceof 与原语的行为是 JavaScript 独特类型系统的结果。虽然这可能会导致混乱,但理解基元和对象之间的区别可以帮助开发人员有效地驾驭这些细微差别。

以上是为什么字符串、布尔值和数字文字无法通过“instanceof”测试?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn