JavaScript 对象复制:浅拷贝与深拷贝100


在 JavaScript 中,对象拷贝是一个常见操作。对象拷贝可以用来创建新对象,以避免对原始对象进行意外修改。但是,JavaScript 对象的拷贝行为可能与你预期的不一样,从而导致代码错误。

在 JavaScript 中, existem 两种类型的对象拷贝:浅拷贝和深拷贝。

浅拷贝

浅拷贝只拷贝对象本身的属性。如果对象包含对其他对象的引用,浅拷贝只会拷贝这些引用的值,而不是引用对象本身。这意味着如果原始对象被修改,浅拷贝对象也将受到影响。

浅拷贝可以使用以下方法实现:```javascript
const 浅拷贝 = (obj) => ({}, obj);
```

以下示例演示了浅拷贝的行为:```javascript
const 原始对象 = {
prop1: 10,
prop2: {
nestedProp: 20
}
};
const 浅拷贝对象 = 浅拷贝(原始对象);
浅拷贝对象.prop1 = 15; // 修改浅拷贝对象的属性
原始对象. = 30; // 修改原始对象的嵌套属性
(原始对象); // { prop1: 10, prop2: { nestedProp: 30 } }
(浅拷贝对象); // { prop1: 15, prop2: { nestedProp: 30 } }
```

在这个示例中,我们创建了一个包含嵌套对象的原始对象。我们使用 `` 函数创建了一个浅拷贝对象。当我们修改浅拷贝对象的 `prop1` 属性时,原始对象不会受到影响。但是,当我们修改原始对象的嵌套属性 `` 时,浅拷贝对象也会受到影响,因为它是对同一对象的引用。

深拷贝

深拷贝不仅拷贝对象本身的属性,还拷贝对象的所有嵌套对象和数组。这意味着如果原始对象被修改,深拷贝对象不会受到影响。

深拷贝可以使用以下方法实现:```javascript
const 深拷贝 = (obj) => ((obj));
```

以下示例演示了深拷贝的行为:```javascript
const 原始对象 = {
prop1: 10,
prop2: {
nestedProp: 20
}
};
const 深拷贝对象 = 深拷贝(原始对象);
深拷贝对象.prop1 = 15; // 修改深拷贝对象的属性
原始对象. = 30; // 修改原始对象的嵌套属性
(原始对象); // { prop1: 10, prop2: { nestedProp: 30 } }
(深拷贝对象); // { prop1: 15, prop2: { nestedProp: 20 } }
```

在这个示例中,我们创建了一个包含嵌套对象的原始对象。我们使用 `` 和 `` 函数创建了一个深拷贝对象。当我们修改深拷贝对象的 `prop1` 属性时,原始对象不会受到影响。当我们修改原始对象的嵌套属性 `` 时,深拷贝对象也不会受到影响,因为它是原始对象的独立拷贝。

何时使用浅拷贝和深拷贝

浅拷贝和深拷贝的性能和内存使用有所不同。浅拷贝比较快,因为只需要拷贝对象的引用。而深拷贝比较慢,因为需要拷贝对象及其所有子对象和数组。浅拷贝的内存使用比较低,因为只存储对象的引用。而深拷贝的内存使用比较高,因为需要存储对象及其所有子对象和数组的副本。

浅拷贝通常用于对象包含原始值或简单对象的场景。深拷贝通常用于对象包含对其他对象或数组的引用的场景。例如,如果一个对象包含一个代表购物车的数组,则建议使用深拷贝来创建该对象的拷贝,以防止对购物车进行意外修改。

了解 JavaScript 中的对象拷贝行为对于编写健壮和可维护的代码非常重要。浅拷贝只拷贝对象的引用,而深拷贝拷贝对象及其所有子对象和数组。选择哪种拷贝方法取决于应用程序的特定需求和性能要求。

2025-02-03


上一篇:JavaScript 入门指南:逐步编写你的第一个脚本

下一篇:JavaScript 对象模型(DOM)