js请详细说明深浅拷贝,并举例子,每一行代码加上注释
时间: 2024-02-25 08:54:50 浏览: 78
好的,以下是关于 JavaScript 中深浅拷贝的详细说明和举例:
## 浅拷贝
浅拷贝是指创建一个新的对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
### 举例
```javascript
// 定义一个原始对象
const sourceObj = {
name: "张三",
age: 18,
hobbies: ["篮球", "足球", "游泳"]
};
// 浅拷贝原始对象
const targetObj = Object.assign({}, sourceObj);
// 修改原始对象的 hobbies 属性
sourceObj.hobbies.push("健身");
// 输出 targetObj 的 hobbies 属性
console.log(targetObj.hobbies); // ["篮球", "足球", "游泳", "健身"]
```
从上面的例子可以看出,当我们修改了原始对象的 hobbies 属性时,浅拷贝的 targetObj 对象也跟着发生了变化。
## 深拷贝
深拷贝是指完全地拷贝一个对象,即使这个对象的属性值是引用类型,也会进行递归拷贝,因此被拷贝的对象和拷贝后的对象是完全隔离的,互不影响。
### 举例
```javascript
// 定义一个原始对象
const sourceObj = {
name: "张三",
age: 18,
hobbies: ["篮球", "足球", "游泳"]
};
// 深拷贝原始对象
const targetObj = JSON.parse(JSON.stringify(sourceObj));
// 修改原始对象的 hobbies 属性
sourceObj.hobbies.push("健身");
// 输出 targetObj 的 hobbies 属性
console.log(targetObj.hobbies); // ["篮球", "足球", "游泳"]
```
从上面的例子可以看出,当我们修改了原始对象的 hobbies 属性时,深拷贝的 targetObj 对象没有发生变化,这就完全隔离了两个对象之间的影响。
需要注意的是,深拷贝虽然可以完全拷贝一个对象,但是在实际使用中,由于其递归拷贝的特性,可能会导致性能问题,因此建议在需要使用深拷贝时,慎重考虑其影响。
阅读全文