JavaScript 中的浅拷贝

17 Mar 2025 | 4 分钟阅读

对象的按位复制被称为“浅拷贝”。当有一个原始对象时,会创建一个新对象,并将原始对象中的相同值复制过来。

要了解浅拷贝,应该先了解数据类型的种类。在本节中,我们将简要介绍数据类型,然后理解 JavaScript 中的浅拷贝。我们还将看一个示例,它将告诉我们浅拷贝是如何工作的。

JavaScript 中的数据类型

基本上,数据类型有两种,如下所示:

  • 原始数据类型:包括布尔值、字节、字符、短整型、长整型、双精度浮点型和整型。
  • 引用数据类型:包括数组和对象。

我们将理解它们在浅拷贝中的作用。

什么是浅拷贝

对象的浅拷贝是指原始对象的引用位置/地址。如果对象中的某个字段引用了其他对象,它只复制该对象的引用地址(即内存地址),而不会创建新对象。这就是浅拷贝与深拷贝的区别。浅拷贝仅复制对象的顶层属性,但嵌套对象在原始对象和复制对象之间共享。浅拷贝只复制集合结构而不复制值。这意味着两个集合共享原始集合的元素。

通常,浅拷贝易于使用且简单,因为它不创建任何对象,只复制引用地址。这不仅适用于数组,也适用于数组。

因此,在原始数据类型的情况下,当我们创建一个原始数据类型变量的副本时,该值会被复制到一个新的内存地址,新的变量指向该地址。因此,每当我们进行复制时,它都会创建一个新的内存位置,并且是变量的真实副本。因此,如果我们执行 c = a,则会创建一个 'a' 的副本。因此,如果我们尝试为 c 分配一个新值,c 的值会改变,但不会影响变量 a 中存储的值。这是因为一旦初始化,值就会被存储一次。

在引用数据类型的情况下,它存储对象的内存地址(即对象存储的位置)。因此,值复制在引用数据类型中工作良好。因此,浅拷贝和深拷贝都是引用数据类型的类型。

现在,我们将尝试通过示例来理解浅拷贝。

浅拷贝示例

考虑两个对象 obj1obj2,其中 obj2 引用 obj1。因此,obj2 将复制与 obj1 相同的内存地址,这意味着两个对象都将具有相同的内存地址,并且只指向同一个地址。

您可以在下面的图表中看到,它很好地表示了示例

Shallow Copy in JavaScript

示例代码实现

下面我们提供了一个代码示例,其中我们为学生详细信息创建了一个浅拷贝

输出

上述代码的输出如下所示

Shallow Copy in JavaScript

代码解释

  • 在上面的代码中,我们创建了一个名为 'student' 的对象,并为其初始化了一些详细的实体。
  • 然后,在应用浅拷贝之前,我们将控制台显示初始化后的值。
  • 接下来,我们初始化了另一个对象 'createcopy',用于创建 'student' 对象的浅拷贝。然后使用 Object.assign 将 'student' 对象分配给 'createcopy'。这意味着 'student' (obj1) 和 'createcopy' (obj2) 对象都将指向相同的内存地址,正如您从上面显示的图像中可以理解的那样。
  • 然后,我们为 'createcopy' 对象设置了与 'student' 对象实体(即 name、enroll_no、permanent_address)不同的值。
  • 最后,我们在控制台输出了 obj2,即 'createcopy' 对象,然后我们可以看到在修改后,对于相同的实体,我们得到了不同的值分配。
  • 另外,我们应该注意到,只有那些我们为 'createcopy' 对象重新分配了值的实体的值发生了变化。其余实体的值保持不变,即 'department' 和 'country'。

因此,通过这种方式,可以创建一个对象的浅拷贝,并用于为对象属性分配不同的值。