js之浅拷贝与深拷贝
- 浅拷贝:只会复制对象的第一层数据
- 深拷贝:不仅仅会复制第一层的数据,如果里面还有对象,会继续进行复制,直到复制到全是基本数据类型为止
简单来说,浅拷贝是都指向同一块内存区块,而深拷贝则是另外开辟了一块区域
例如,下面就是浅拷贝:
let arr = [1,2,3,4];
let arr2 = arr;
arr2.push(5);
console.log(arr); // [1, 2, 3, 4, 5]
console.log(arr2); // [1, 2, 3, 4, 5]
对深拷贝来说,有以下的方法:
1. 深拷贝的简单方法:
- 对数组来说:
let arr = [1,2,3,4];
let arr2 = [];
for(let i=0;i<arr.length;i++){
arr2[i] = arr[i];
}
arr2.push(5);
console.log(arr); // [1, 2, 3, 4]
console.log(arr2); // [1, 2, 3, 4, 5]
- 对对象来说(for..in):
let obj = {
name:"haha",
age:18
}
let obj2 = {};
for(var attr in obj){
obj2[attr] = obj[attr]
}
obj2.name = 'hehe';
console.log(obj); // {name: "haha", age: 18}
console.log(obj2); // {name: "hehe", age: 18}
2. 转成 JSON 再转回来
用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象。
let arr = [1,2,3,4];
let arr2 = JSON.parse(JSON.stringify(arr));
// JSON.parse() 用于将一个 JSON 字符串转换为 JavaScript 对象。
// JSON.stringify() 用于将 JavaScript 值转换为 JSON 字符串。
arr2.push(5);
console.log(arr); // [1, 2, 3, 4, 5]
console.log(arr2); // [1, 2, 3, 4, 5]
3. 深拷贝的es6方法:Object.assign()
let obj = {
name:"haha",
age:18
}
let obj2 = {};
Object.assign(obj2,obj);
obj2.name = 'hehe';
console.log(obj); // {name: "haha", age: 18}
console.log(obj2); // {name: "hehe", age: 18}
4. 深拷贝的方法封装:
但是,对于下面的例子(包含多层对象),不能用Object.assign()
let arr = [1,2,3,4,[5],{}];
let arr2 = Object.assign([],arr);
arr2[4].push(6);
console.log(arr) // [1, 2, 3, 4, [5,6], {…}]
console.log(arr2) // [1, 2, 3, 4, [5,6], {…}]
所以,这里封装了一个深拷贝函数deepClone
let arr = [1,2,3,4,[5],{}];
let arr2 = deepClone(arr);
arr2[4].push(6);
function deepClone(obj){ //深度克隆
let o = obj.push?[]:{};
for(let attr in obj){
//值为复合类型
if(typeof obj[attr] === 'object' && obj[attr]!=null){
o[attr] = deepClone(obj[attr]);
}else{
o[attr] = obj[attr];
}
}
return o;
}
console.log(arr) // [1, 2, 3, 4, [5], {…}]
console.log(arr2) // [1, 2, 3, 4, [5,6], {…}]
js之浅拷贝与深拷贝的更多相关文章
- js对象浅拷贝和深拷贝详解
js对象浅拷贝和深拷贝详解 作者:i10630226 字体:[增加 减小] 类型:转载 时间:2016-09-05我要评论 这篇文章主要为大家详细介绍了JavaScript对象的浅拷贝和深拷贝代码,具 ...
- Javascript/js 的浅拷贝与深拷贝(复制)学习随笔
js变量的数据类型值分基本类型值和引用类型值. 在ES6(ECMAScript6)以前,基本数据类型包括String.Number.Boolean.Undefined.Null. 基本类型值的复制(拷 ...
- js实现浅拷贝和深拷贝
实现浅拷贝和深拷贝 1. 浅拷贝和深拷贝的区别 简单点说,浅拷贝拷贝完后,修改拷贝的内容可能会对源内容产生影响.而深拷贝就是拷贝前后的内容相互不影响. 那为什么拷贝前后的内容会相互影响呢? ...
- [转] js对象浅拷贝和深拷贝详解
本文为大家分享了JavaScript对象的浅拷贝和深拷贝代码,供大家参考,具体内容如下 1.浅拷贝 拷贝就是把父对像的属性,全部拷贝给子对象. 下面这个函数,就是在做拷贝: var Chinese = ...
- js中浅拷贝和深拷贝以及深拷贝的实现
前言:2019年的第一篇分享... 一.什么是基本类型值和引用类型值?ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型.基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构 ...
- js的浅拷贝和深拷贝和应用场景
为什么会用到浅拷贝和深拷贝 首先来看一下如下代码 let a = b = 2 a = 3 console.log(a) console.log(b) let c = d = [1,2,3] let e ...
- 小tips:JS之浅拷贝与深拷贝
浅拷贝: function extendCopy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } return c; } 深拷贝: functio ...
- js相关--浅拷贝和深拷贝
1.js的数据类型 基本概述:js的数据类型分为两种,分别为基本数据类型和引用数据类型,它们俩的区别在于基本数据类型采用值传递,引用数据类型采用指针形式传递. 如下所示:引用类型通过简单的=进行复制, ...
- JS的浅拷贝与深拷贝
浅拷贝 //这样的拷贝有一个问题.那就是,如果父对象的属性等于数组或另一个对象,//那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能. function exten ...
随机推荐
- 固态硬盘和机械硬盘的比较和SQLSERVER在两种硬盘上的性能差异
固态硬盘和机械硬盘的比较和SQLSERVER在两种硬盘上的性能差异 在看这篇文章之前可以先看一下下面的文章: SSD小白用户收货!SSD的误区如何解决 这样配会损失性能?实测6种特殊装机方式 听说固态 ...
- python2与python3的区别(持续更新)
1,print(打印),python2不换行可以使用逗号,python3不换行使用end='' python2版本: print 'a' 输出一个字符串 print a 输出一个变量 print 'a ...
- MySQL自带的性能压力测试工具mysqlslap
mysqlslap是从MySQL的5.1.4版开始就开始官方提供的压力测试工具. 通过模拟多个并发客户端并发访问MySQL来执行压力测试,同时提供了较详细的SQL执行数据性能报告,并且能很好的对比多个 ...
- win10桌面显示我的电脑设置
首先,我们可以看到桌面上面没有我的电脑. 我们在桌面空白处点击右键,选择“个性化”. 然后选择“更改桌面图标”,如图示. 在如图示位置,将“计算机”勾选,然后点击“应用”--" ...
- Qt分页导航控件
最近在使用QTableWidget时,因为结果数量比较多而且又有单元格控件,为了改善效率要做分页处理.在网上找了一番,最后在http://www.cppblog.com/biao/archive/20 ...
- 利用MVC Chart 打造后台图表、前端图表
应用场景是这个样子的:要做导出数据到PDF的功能,涉及到文本.表格.图表等内容.在做图表功能时,发现之前用Highcharts做的图表根本就不能集成到PDF中.这里需要一个能在程序后台就生成图表的功能 ...
- 修改win下ras/pppoe/l2tp等连接数限制
最近宽带重新拔号一直不换ip,拔了十几分钟IP仍然不变,想起几年前的pppoe多拔,多拔几个PPPOE占着老IP,再拔新的IP出来用 注册表路径,子项中查看MatchingDeviceId判断协议类型 ...
- beta阶段学习博客(一) js交互
js交互 js交互的三种方法
- github与本地电脑关联配置
参考文章:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137438585 ...
- MySql详解(二)
MySql的安装和使用安装过程可以自行百度,非常简单,一直下一步就行,这里省略. 启动和停止MySql服务:• 方式一:通过计算机管理方式右击计算机—管理—服务—启动或停止MySQL服务• 方式二:通 ...