当前位置:网站首页>js中如何实现深拷贝?
js中如何实现深拷贝?
2022-08-01 09:16:00 【二脸懵逼】
如何实现深拷贝、浅拷贝?
1、什么是深拷贝、浅拷贝?
2、深拷贝的实现方式
深拷贝是针对于引用数据类型
方法1:通过ES6新增的扩展运算符(…)实现
代码示例
let arr = [1, 2, 5, 3, 7, 4];
//进行深拷贝
let newArr = [...arr];
console.log('深拷贝的新数组', newArr);
//对新数组中的元素值进行修改
newArr[3] = 273287;
console.log('修改值后的新数组', newArr);
console.log('原数组', arr);//原数组中的值未被修改
运行结果
方法2:通过JSON对象实现
通过JSON.stringify()将对象转为字符串,通过JSON.parse()将字符串转为JSON对象,此时会变成一个新的对象
此方法的缺点:无法拷贝对象内部的函数
代码示例
let obj = {
name: '张三',
address: {
sheng: "四川",
shi: "成都"
},
sex: "男",
fun: () => {
console.log(obj.name);
}
}
console.log('原obj',obj);
//通过JSON.stringify()将obj转为字符串
let str=JSON.stringify(obj);
// 再通过JSON.parse()将字符串转为JSON对象
let newObj=JSON.parse(str);
console.log('新newObj',newObj);//obj中的函数没有进行拷贝
//修改新对象的值
newObj.name='李四';
console.log('修改属性值后新对象',newObj);
console.log('修改新对象属性值后的原对象',obj);//未发生变化
运行结果
方法3:使用递归的方法实现
代码示例:
function deepClone(obj) {
// 判断传递过来形参是不是数组
let objClone = Array.isArray(obj) ? [] : {};
if (obj && typeof obj === 'object') {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
// 判断obj子元素是否为对象,如果是,递归复制
if (obj[key] && typeof obj[key] === 'object') {
objClone[key] = deepClone(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
let a=[1,2,3,4,{name:"张珊",age:18}];
let b=deepClone(a);
console.log('原数组a',a);
console.log('深拷贝后的新数组b',b);
//对原数组的值进行修改
a[3]=99999;
a[4].age=34567
console.log('修改原数组元素值后的原数组a',a);
console.log('修改原数组元素值后的新数组b',b);
运行结果
方法4:通过jquery中的extend方法实现
let arr = [1, 3, 5, 7];
let newArr = $.extend(true, [], arr);//true为深拷贝,false为浅拷贝
newArr.push(999)
console.log('newArr',newArr);
console.log('arr',arr);
边栏推荐
- Holoview--Introduction
- sql server, FULL模式, dbcc shrinkfile(2,1) 不能收缩事务日志,还是原来的大小,是为什么?
- How does UXDB return the number of records for all tables in the current database?
- net stop/start mysql80 拒绝访问
- gethostbyname \ getaddrinfo 解析域名IP地址不安全的原因
- 【Untitled】
- USB Protocol (2) Terminology
- zip打包目录所有文件(含隐藏文件/夹)
- 在GBase 8c数据库后台,使用什么样的命令来对gtm、dn节点进行主备切换的操作
- Case practice --- Resnet classic convolutional neural network (Mindspore)
猜你喜欢
Prime Ring Problem(素数环问题)
HoloView -- Tabular Datasets
leetcode-6135:图中的最长环
Leicester Weekly 304 6135. The longest ring in the picture Inward base ring tree
【STM32】入门(一):环境搭建、编译、下载、运行
various network protocols
18张图,直观理解神经网络、流形和拓扑
VoLTE Basic Learning Series | Enterprise Voice Network Brief
Redis学习
力扣周赛304 6135. 图中的最长环 内向基环树
随机推荐
22牛客多校1 I. Chiitoitsu (概率dp)
《时代》杂志:元宇宙时代将改变世界
USB 协议 (二) 术语
Mysql database deployment and initialization steps
Idea common plugins
leetcode-6133:分组的最大数量
HoloView -- Tabular Datasets
HoloView 在 jyputer lab/notebook 不显示总结
net stop/start mysql80 access denied
SkiaSharp's WPF self-painted five-ring bouncing ball (case version)
报告:想学AI的学生数量已涨200%,老师都不够用了
[Interview: Concurrency 39: Multithreading: Thread Pool] ThreadPoolExecutor Class - Submit, Stop
leetcode-6135:图中的最长环
pytest interface automation testing framework | parametrize source code analysis
MySQL查询进阶——从函数到表连接的使用你还记得吗
网络基础学习
MySQL query advanced - from the use of functions to table joins, do you remember?
Go supports OOP: use struct instead of class
用OpenCV的边缘检测
sqlserver怎么查询一张表中同人员的交叉日期