理解JavaScript:深拷贝与浅拷贝完全解析
151 浏览量
更新于2024-08-31
收藏 149KB PDF 举报
"本文详细解析了JavaScript中的深拷贝与浅拷贝概念,通过实例和代码解释了它们的区别和应用场景。"
在JavaScript中,深拷贝和浅拷贝是处理复杂对象(如对象和数组)时非常重要的概念。理解这两者之间的差异对于编写可维护和可靠的代码至关重要。
1. **预备知识**
- **JS数据类型**:JavaScript中有两种主要的数据类型,基本数据类型(如Boolean、String、Number、null、undefined)和引用数据类型(如Object、Array、Function等)。基本数据类型是按值传递,而引用数据类型则是按引用传递。
- **数据类型的复制**:基本数据类型复制时,复制的是值本身。但对于引用数据类型,复制的是对象的引用,意味着新旧对象指向同一内存空间,修改其中一个会影响另一个。
2. **深拷贝与浅拷贝**
- **浅拷贝**:浅拷贝只复制对象的第一层属性,新旧对象共享同一内存空间,因此修改新对象会影响原对象。例如,使用赋值操作符或`Object.assign()`方法进行的拷贝就是浅拷贝。
- **深拷贝**:深拷贝会创建一个全新的对象,所有属性包括嵌套的对象和数组都会被递归复制,新旧对象之间不共享内存。这意味着修改新对象不会影响原对象。深拷贝可以使用递归函数、`JSON.parse(JSON.stringify())`(有局限性)或者某些库(如lodash的`_.cloneDeep`方法)实现。
3. **JS浅拷贝示例**
```javascript
var obj1 = {
name: 'zhangsan',
language: [1, [2, 3], [4, 5]]
};
var obj2 = obj1;
obj2.name = "lisi";
obj2.language[1] = ["二", "三"];
console.log('obj1', obj1); // 输出修改后的值,因为obj1和obj2共享引用
console.log('obj2', obj2);
```
4. **手写浅拷贝函数**
```javascript
function shallowCopy(obj1) {
let obj2 = Array.isArray(obj1) ? [] : {};
for (let key in obj1) {
if (obj1.hasOwnProperty(key)) {
obj2[key] = obj1[key];
}
}
return obj2;
}
```
上述函数仅能实现第一层属性的浅拷贝,如果对象包含嵌套的对象或数组,它们仍然会被共享。
5. **深拷贝实现**
- **递归函数**:可以自定义一个函数,对对象的每个属性进行递归拷贝,直到遇到的基本数据类型为止。
- **JSON方法**:`JSON.parse(JSON.stringify(obj))`可以实现深拷贝,但不能处理函数和循环引用的情况。
- **第三方库**:使用如lodash或jQuery等库,它们提供了深拷贝的功能,处理复杂情况更高效且全面。
理解深拷贝和浅拷贝对于避免不必要的副作用和正确管理JavaScript中的对象至关重要。在处理复杂数据结构时,确保清楚何时需要深拷贝,何时使用浅拷贝,将有助于编写出更加可控和健壮的代码。
2021-12-16 上传
2021-12-29 上传
2020-10-20 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
2020-11-22 上传
weixin_38631042
- 粉丝: 4
- 资源: 926
最新资源
- course_Systems_Biology:天津医科大学,生物医学工程与技术学院,《系统生物学》课程资料
- radomPassword:JS随机密码生成器
- Pupil-issue:Pupil的仅发行库
- api-doc:用PHP编写的功能强大的api文档管理系统
- Excel模板基础体温表--可直接打印.zip
- Reprogram2020_B:Payton,Shalin,Kyle,Justin
- an0060-efm32-aes-bootloader.zip
- AssetsReporter:[Unity]资产导入设置报告系统
- LaserShooter:LaserShooter正在ShootingGame
- phasepack-matlab-master_相位恢复算法_相位恢复_相位成像
- springbootwebapp:Spring Boot Web应用程序
- DataRecorderApp:客户义工项目
- 用于React原生的 iOS 和 Android 原生搜索组件
- DevSena:基于AI的事故检测系统
- beetle-fanpage:我的甲虫的粉丝专页
- Vortex laser_laservortexmatlab_vortex_涡旋光_衍射_涡旋光衍射