首页 > 编程知识 正文

简述深拷贝和浅拷贝,数组浅拷贝和深拷贝的区别

时间:2023-05-04 14:44:50 阅读:32004 作者:2287

文章目录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:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。