JavaScript 中的自动装箱

2025 年 4 月 18 日 | 阅读 6 分钟

1285 JavaScript 和其他面向对象编程语言中的原始值不包含方法和属性。为了使用它们,必须通过包装器将其转换为对象数据类型。计算机语言最基本的构建块是原始数据类型。JavaScript 中有六种原始类型:object、String、number、undefined 和 symbol。

对象 包装在原始值周围的工作称为装箱。当使用 JavaScript 创建对象(调用 toUpperCase() 方法)时,JavaScript 会自动将原始类型转换为相关的对象类型。然后,相关的内置对象将连接到这个新对象类型,从而可以在原始类型上使用原型方法。

在 JavaScript 中使用自动装箱

自动装箱是 JavaScript 使用的一种方法。当您尝试访问方法或属性时,JavaScript 会自动将原始类型转换为其等效的对象包装器,然后执行操作并丢弃临时对象。

JavaScript 的自动装箱用于从原始数据类型的值自动进行对象转换。在 JavaScript 中,这种情况发生在两种情况下:

  • 在调用 .call 或 .apply(非严格模式)并将原始值作为 this 值传递时,原始类型在使用方法或属性时可以暂时表现得像对象。
  • 当尝试访问原始值的“property.split()”方法时。在此过程之后,实际的原始值保持不变。

原始类型

创建 字符串 并测量其长度很容易,但 String 原始类型如何访问 String 对象上的属性?

原始类型没有方法和属性。尽管从上面的代码来看,原始值似乎有方法,但在这种情况下并非如此。它的工作原理就像魔法一样,而且 JS 有一个自动装箱选项。

当我们对原始类型调用任何方法或属性时,它们会被包装到其关联对象或内置对象中。在上面的示例中,它是一个字符串。因此,自动装箱提供了方法和属性来访问它,并有助于将原始类型与其内置对象连接起来。

序号。代码输出
1String('hii')'hii'
2String('hii') == new String('hii')true
3String('hii') === new String('hii')false
4new String('hii') === new String('hii')false
5new String('hii') == new String('hii')false
6String('hii') instanceof Stringfalse
7new String('hii') instanceof Stringtrue

我想先强调几个情况,然后再讨论它们。

  1. 这是一个简单的字符串,它会返回您提供给它的值,当您在控制台中打印它时。
  2. 这里正在进行字符串原始值和字符串对象之间的比较(它是通过 new 调用构造的)。返回值为 true,因为这只会比较值。检查新生成的 String('hii') 输出后,控制台中显示什么?
  3. 由于类型不同,我们在这里用类型进行的验证肯定会返回 false。一个是对象,另一个是字符串。
  4. 为什么这是错误的?当我们比较两个不同的对象时,即使它们的值相同,它们也不能相同。为什么?返回 false 的原因是它们是通过引用(即它们的内存地址)进行比较的,而引用因对象而异。
  5. 它的推理与之前相同。对象的内存地址由其值表示,而该值与其包含的精确值相关(您了解指针吗?如果不了解,请看这里。
  6. String 不是 String 类的实例,因为它是一个原始类型。然而,会进行自动装箱以便访问属性。
  7. 它是 String 类的实例,因为使用了 new 运算符来生成它。

示例

下面的示例显示了使用 new 关键字和基本方法的自动装箱。我们可以使用不同的 JavaScript 关键字来获取 String 的值。

输出

输出图像显示了数据的相关信息。

Autoboxing in JavaScript

何时以及为何应用原始值?

在处理字符串、数字或任何其他原始类型时,通常最好使用原始值。它为什么高效?

上面提到的 String 是简单的,没有任何关联的方法或属性。因此,将获取 testStr 的值会快得多。当我们获取以下语句中 length 属性的值时会发生什么?TestStr 不是字符串的实例,因此 JS 会通过将其与相同的包装器对齐并确定其类型来自动装箱。

根据我们调用的原始类型方法,JS 会进行来回调用。当今的 JS 引擎高度发达,因此无需每次都遵循前面提到的过程。

示例

以下示例显示了使用 JavaScript 方法和关键字的自动装箱。我们可以使用 valueof、length 和其他关键字来获取特定的输出。

示例 1

下面的示例显示了使用 JavaScript 方法和关键字的自动装箱。我们可以使用 valueOf() 方法,在不使用 new 关键字的情况下获取特定的字符串。

输出

输出图像显示了数据的相关信息。

Autoboxing in JavaScript

示例 2

下面的示例显示了使用 new 关键字和基本方法的自动装箱。我们可以使用 valueOf() 方法,在不使用 new 关键字的情况下获取特定的字符串。

输出

输出图像显示了数据的相关信息。

Autoboxing in JavaScript

示例 3

下面的示例显示了使用 new 关键字和基本方法的自动装箱。我们可以使用不同的 JavaScript 关键字来获取 String 的值。

输出

输出图像显示了数据的相关信息。

Autoboxing in JavaScript

示例 4

下面的示例显示了使用 new 关键字和基本方法的自动装箱。我们可以使用不同的 JavaScript 关键字来获取 String 的值。

输出

输出图像显示了数据的相关信息。

Autoboxing in JavaScript

结论

自动装箱是一个简单而基本的概念,用于保留数据并使用不同类型的操作。它可以使用 JavaScript 关键字提供输入数据信息,并有助于在关键字对其进行操作时保持不变。