JavaScript浅拷贝与深拷贝的代码实现解析
需积分: 50 113 浏览量
更新于2024-12-13
收藏 1KB ZIP 举报
"
浅拷贝(Shallow Copy):
浅拷贝是指创建一个新的复合对象,然后将原对象中的顶层元素复制到新对象中,如果元素是基本类型,拷贝的就是值本身,如果元素是引用类型(对象或数组),拷贝的就是引用地址。因此,新旧对象中的引用类型元素会指向同一个内存地址。在JavaScript中,浅拷贝常见的实现方法有以下几种:
1. Object.assign()方法:这是ES6提供的一个方法,用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,它进行的是浅拷贝。
```javascript
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = Object.assign({}, obj1);
obj2.a = 2; // 对基本类型的属性更改不影响obj1
obj2.b.c = 3; // 对引用类型属性的更改会影响到obj1
```
2. 展开运算符(...):在ES6中引入的扩展运算符可以用来实现浅拷贝,效果与Object.assign()类似。
```javascript
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = { ...obj1 };
```
3. Array.prototype.slice()方法:对数组使用slice()方法可以创建一个数组的浅拷贝。
```javascript
let arr1 = [1, 2, [3]];
let arr2 = arr1.slice();
arr2[2][0] = 4; // 修改嵌套数组元素,原数组也会被修改
```
4. 使用循环遍历数组或对象的属性进行赋值,也是一种浅拷贝的实现方式。
```javascript
function shallowCopy(obj) {
let copy = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = obj[key];
}
}
return copy;
}
```
深拷贝(Deep Copy):
深拷贝是指创建一个新的复合对象,并递归地复制原对象的所有层级的子对象,从而完全独立于原对象。深拷贝不会产生引用同一个对象的副本,任何一个对象的更改都不会影响到另一个对象。在JavaScript中实现深拷贝有多种方式:
1. JSON.parse()与JSON.stringify()方法结合:这是实现深拷贝的一种简单方式,通过将对象转换为JSON字符串,然后再将字符串解析成新的对象。
```javascript
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = JSON.parse(JSON.stringify(obj1));
obj2.b.c = 3; // 改变obj2的深层属性不会影响obj1
```
2. 使用递归函数进行深拷贝:这种方法需要编写一个能够递归复制对象所有层级属性的函数。
```javascript
function deepCopy(obj) {
if (obj === null || typeof obj !== 'object') {
return obj;
}
let copy = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = deepCopy(obj[key]);
}
}
return copy;
}
```
3. 使用第三方库进行深拷贝:一些成熟的JavaScript库提供了深拷贝的函数,例如lodash的_.cloneDeep()方法。
```javascript
// 引入lodash库后使用
import _ from 'lodash';
let obj1 = { a: 1, b: { c: 2 } };
let obj2 = _.cloneDeep(obj1);
obj2.b.c = 3; // 改变obj2的深层属性不会影响obj1
```
注意事项:
- 使用JSON.parse(JSON.stringify())方法进行深拷贝时,不能处理函数和undefined等特殊类型,因为JSON格式不支持这些类型。
- 递归深拷贝函数需要谨慎处理循环引用的问题,否则可能会导致栈溢出。
以上内容是基于文件信息中“js代码-浅拷贝深拷贝”的知识点梳理。
2021-07-15 上传
2021-07-15 上传
2021-07-14 上传
2023-10-19 上传
202 浏览量
2023-10-10 上传
2023-04-07 上传
2025-01-24 上传
136 浏览量

x_jiali
- 粉丝: 5
最新资源
- Android应用-Goldcard-Helper使用教程
- 探索iOS静态库中集成XIB文件的实现方法
- 51单片机实现1602液晶显示秒表的设计与实现
- LPC1768 EasyWEB网络开发与测试指南
- WebGIS地图开发实用代码示例与压缩技术
- ColorCols:挑战色彩匹配的开源平台游戏
- C++实现公司工资管理系统:增删改查与链表文件存储
- Android应用崩溃模拟工具Krasha介绍
- UDF编程心得:经验总结与推荐
- Craters.js:轻量级HTML5游戏引擎的构建与特性介绍
- 基于信息技术的学生考勤签到系统设计
- Golden Software Surfer 11.0.642汉化教程与win7兼容性
- 深入剖析Android热修复技术原理及应用
- 王晓东编著《数据结构与STL框架》PPT解析
- 51单片机实现可调占空比PWM方波输出教程
- C语言高精度加法算法实现与应用