文章目录1、引用2、浅副本1.object.assign(2.concat )3.扩展运算符3、深副本1.json数据与JSON字符串之间的转换2.$.extend )3.利用递归
查完多篇文章后,自己总结总结一下对深拷贝和浅拷贝的理解、不足,还有很多期待指导
一、引言基本数据类型数据赋值后,改变赋值后的变量,两者互不影响;
let a=100; let b=a; a=200; 控制台. log (a; //200控制台. log (b ); //100参照数据类型的数据代入后,分配给接收堆栈存储器中保存的地址的变量,变更代入后的变量,会影响原始数据
//复杂的数据类型: Array、Objectlet obj1={ name:'qxdjz ',age :18 } letobj2=obj1obj1. age=25; 控制台. log (obj 1; //{name:'qxdjz ',age:25}console.log(obj2); //{name:'qxdjz ',age:25}针对上述问题,引出了本文解决方案的深拷贝和写拷贝
二、轻拷贝定义:
创建具有原始对象属性值的准确副本的新对象。
如果属性为基本类型,则复制的是基本类型的值。
如果属性为引用类型,则复制的是内存地址,因此一个对象更改此地址会影响另一个对象。
缺陷:轻拷贝写入只能实现一层拷贝,不能进行深拷贝
实现方法
1 .如何在1.Object.assign () ES6中复制对象。 第一个接受的参数是副本的目标,其馀参数是副本的源对象(可以是多个)。
33558 www.Sina.com/object.assign (target, sources ) )。
语法:
let obj1={name: 'qxdjz ',age:18}//object.assign(}与以下写法相同//letobj2=object.asign ) ) 控制台. log (obj 1; //{name: '张',age:25}console.log(obj2); //{name:'qxdjz ',age:18} 2.concat ()举个栗子:concat ) )合并两个或多个数组并返回新数组。 原始数组保持不变
语法:
letarr=[ 1,2,3,4 ]; let newArr=arr.concat () arr.push(5) ) 5; 控制台. log (arr; //[ 1,2,3,4,5 ]控制台. log (new arr ); //[ 1,2,3,4 ]3.如果对象中的所有属性都是基本数据类型,则扩展运算符更有用
举个栗子:
let obj1={name: 'qxdjz ',age :18 } letobj2={ . obj1} obj1. name='张'; obj1.age='25 '; console.log(obj1,obj2); letarr=[ 1,2,3 ] let newarr=[ . arr ] arr [0]=999 console.log (arr,new arr ) )运行结果:
三、深拷贝无论原始数据中的值是什么类型的数据,拷贝后的新数据和原始数据都是相互独立的,没有关联
实现方法
1 .在json数据和json字符串之间的转换json.stringify ) )将对象转换为JSON字符串
JSON.parse ()反序列化使JSON字符串成为新对象
对于日常开发需求(对象和数组),使用此方法最简单快捷
举个栗子:无法实现对象缺点:的复制,显示为undefined
let obj1={name: 'qxdjz ',age: 18,father: {age: 40},fn : function ({ return 123 } ) lettemp=JSON con //{name:'qxdjz ',age:18,father:{age:50},fn(}console.log(obj2); //{name: '张',age:25,father:(age:40 ) }console.log(obj2.fn )/underfind2.$.$.extend )
33558 www.Sina.com/jquery.extend ([ deep ],target,object1,[objectN] ) )
deep的默认值为false
方法
只有引入jQuery的CDN,该方法let obj1={name: 'qxdjz ',age: 18,father: {age: 40},fn 3360 function (} { return 1118 )直通车:
3 .递归functiondeepclone(obj ) /定义确定当前参数是数组还是对象letobjclone=array.isarray ) obj的对象。 [] : {}; 判断是否存在//OBJ且类型为对象。 (typeof [] ()也是object ) if ) objtypeofobj==='object ' ) /遍历参数的键for(keyinobj ) {//hasOwnProperty )方法中for.in和常用的//,如果对象具有此属性if(obj.hasownproperty ) key )//的值,则为递归if ) obj [ key ] type of obj } } }返回对象克隆; }leta={name:'qxdjz ',age: 18,father:{name: '大李',},fn : function ({ return 123 } } ) letb=3: