JavaScript 浅拷贝
对一个对象进行按位拷贝被称为“浅拷贝”。当存在一个原始对象时,会创建一个新的对象,其中包含与原始对象中相同的值。
为了了解浅拷贝,需要了解数据类型的种类。在这个部分,我们将简要介绍数据类型,并理解JavaScript中的浅拷贝。我们也会看一个示例,来说明浅拷贝的工作原理。
JavaScript中的数据类型
基本上,有两种类型的数据类型,如下所示:
- 基本数据类型: 包括Boolean、byte、char、short、long、double和int。
- 引用数据类型: 包括数组和对象。
我们将会了解浅拷贝在其中的作用。
什么是浅拷贝
对象的浅拷贝指的是原始对象的引用位置/地址。如果对象的任何字段引用到其他对象,那么仅会拷贝对象的引用地址(即内存地址),而不会创建新的对象。这就是浅拷贝与深拷贝不同的地方。浅拷贝复制对象的顶级属性,但嵌套对象在原始对象和拷贝对象之间是共享的。浅拷贝只会复制集合的结构而不是值。这意味着两个集合共享原始集合的元素。
通常,浅拷贝易于使用,因为不会创建新对象,只会复制引用地址。不仅仅适用于数组,对数组也是一样。
因此,在原始数据类型的情况下,当我们创建原始数据类型变量的副本时,该值会复制到一个新的内存地址,而新变量指向该地址。所以,每当我们进行一次拷贝时,都会创建一个新的内存位置,并且是变量的真正副本。因此,如果执行c = a,将创建’a’的一个副本。所以,如果我们尝试给c分配一个新值,c的值将会改变,但不会影响变量a中存储的值。这是因为一旦初始化,值只存储一次。
在引用数据类型的情况下,它存储对象的内存地址(即对象存储的位置)。因此,值的复制在引用数据类型中运行良好。所以,浅拷贝和深拷贝都只是引用数据类型。
现在,我们将通过一个示例来理解浅拷贝。
浅拷贝的示例
考虑两个对象obj1和obj2,其中obj2引用了obj1。因此,obj2将会拷贝与obj1相同的内存地址,这意味着两个对象将具有相同的内存地址,并且将指向同一个地址。
下面的图示描述了这个示例:
示例代码实现
下面是一个代码示例,我们为学生的详情创建了一个浅拷贝:
<script>
let student = {
name: 'Michael',
department: 'Computer Science',
enroll_no: '1829939',
permanent_address: {
house_no: '200',
locality: 'Simi Valley',
city: 'New York',
country: 'USA'
}
};
console.log("Before applying Shallow Copy");
console.log(student);
let createcopy = Object.assign({}, student);
createcopy.name = 'Abraham Smith';
createcopy.enroll_no = '1829887';
createcopy.permanent_address.house_no = '321';
createcopy.permanent_address.locality = 'Santa Maria';
createcopy.permanent_address.city = 'California';
console.log("After applying Shallow Copy");
console.log(createcopy);
</script>
输出:
上述代码的输出如下所示:
代码解释
- 在上面的代码中,我们创建了一个名为’student’的对象,并对其中的一些详细实体进行了初始化。
- 然后,在应用浅复制之前,我们在控制台上打印了已初始化的值。
- 接下来,我们创建了另一个对象’createcopy’,用于创建’student’对象的浅复制。然后使用Object.assign将’student’对象赋值给’createcopy’。这意味着’createcopy’(obj2)对象和’student’(obj1)对象将指向相同的内存地址,你可以从上图中看出。
- 然后,我们从’student’对象的实体(即name、enroll_no和permanent_address)为’createcopy’对象设置了不同的值。
- 最后,我们打印了’createcopy’对象的obj2,即’createcopy’对象,然后我们可以看到在修改后,我们得到了不同值的不同赋值的输出。
- 此外,我们应该注意到只有我们再次为’createcopy’对象分配的那些实体的值发生了改变。其他实体的值保持不变,即’department’和’country’。
因此,通过这种方式,可以创建一个对象的浅复制,并用于为对象属性分配不同的值。