仔细看看,会有收获。js深浅拷贝

好好理解深浅拷贝和赋值(针对引用类型)

赋值:两个对象指向同一内存地址。结果,无论是修改基本类型还是引用类型,两个对象的值都会改变。

浅拷贝:两个对象指向不同的内存地址,但是他们中的引用类型数据指向同一内存地址。结果,修改引用类型,两个对象的值都会改变;修改基本类型,互不影响。

深拷贝:两个对象指向不同的内存地址,他们中的引用类型也指向不同的内存地址。结果,均互不影响。

直接通过Object.assign()实现浅拷贝

浅拷贝:

1const target = { 2 a: 1, 3 b: 2 , 4 c:[1,2], 5 d:function() { 6 console.log(this.d) 7 } 8}; 9let newObj = Object.assign({},target); 10newObj.a = 3 11newObj.c[1] = 3 12console.log('newObj',newObj) 13console.log('target',target)

手写深浅拷贝:

浅拷贝:

1let target = { a: 1, b: 2 ,c:[1,2],d:function() { 2 console.log(this.d) 3}}; 4//let cc = Object.assign({},target); 5let cc = shallowClone(target); 6cc.c[1] = 4 7console.log('cc',cc) 8console.log('target',target) 9function shallowClone(obj) { 10 let newObj = new Object() 11 for (const key in obj) { 12 if (Object.hasOwnProperty.call(obj, key)) { 13 newObj[key] = obj[key]; 14 } 15 } 16 return newObj 17}

深拷贝:

1let target = { a: 1, b: 2 ,c:[1,2],d:function() { 2 console.log(this.d) 3}}; 4let cc = deepClone(target); 5cc.c[1] = 4 6console.log('cc',cc) 7console.log('target',target) 8function deepClone(obj) { 9 let type = Object.prototype.toString.call(obj) 10 console.log(type) 11 if(type.indexOf('Object') === -1){ 12 return obj 13 }else{ 14 let newObj = new Object() 15 for (const key in obj) { 16 if (Object.hasOwnProperty.call(obj, key)) { 17 newObj[key] = deepClone(obj[key]); 18 } 19 } 20 return newObj 21 } 22}
点赞
收藏

评论区

加载中...

相关推荐

java 复制Map对象(深拷贝与浅拷贝)

java复制Map对象(深拷贝与浅拷贝)CreationTime2018年6月4日10点00分Author:Marydon1.深拷贝与浅拷贝  浅拷贝:只复制对象的引用,两个引用仍然指向同一个对象

2022年最新iOS面试题(附答案)

最近大家都要准备去面试或者已经在面试的,这里我给大家准备了挺多资料,可以私信我拿,看看了解下。底下就是我整理出来的一些面试题iOS类(class)和结构体(struct)有什么区别?Swift中,类是引用类型,结构体是值类型。值类型在传递和赋值时将进行复制,而引用类型则只会使用引用对象的一个"指向"。所以他们两者之间的区别就是两个类型的区别。举个简单的

也谈JavaScript浅拷贝和深拷贝

网上关于这个话题,讨论有很多了,根据各路情况我自己整理了一下,最后还是能接近完美的实现深拷贝,欢迎大家讨论。javascript中的对象是引用类型,在复制对象的时候就要考虑是用浅拷贝还是用深拷贝。直接赋值对象是引用类型,如果直接赋值给另外一个对象,那么只是赋值一个引用,实际上两个变量指向的同一个数据对象,如果其中一个对象的属性变更,那么另外一个也会变更。示

实现深拷贝的多种方式

实现深拷贝的多种方式简单来说,深拷贝主要是将另一个对象的属性值拷贝过来之后,另一个对象的属性值并不受到影响,因为此时它自己在堆中开辟了自己的内存区域,不受外界干扰。浅拷贝主要拷贝的是对象的引用值,当改变对象的值,另一个对象的值也会发生变化。1.简单深拷贝(一层浅拷贝)①for循环拷贝//只复制第一层的浅拷贝javascriptfunc

React之浅拷贝与深拷贝

 最近发现的一个bug让我从react框架角度重新复习了一遍浅拷贝与深拷贝。浅拷贝,就是两个变量都是指向一个地址,改变了一个变量,那另一个变量也随之改变。这就是浅拷贝带来的副作用,两个变量会相互影响到,因为它们指向同一个地址。深拷贝,就是互相独立,指向的是不同的地址,一个变量改变了,另一个变量不会被影响到。react角度:父组件传给

Java深拷贝和浅拷贝

1.浅复制与深复制概念⑴浅拷贝(浅克隆)   复制出来的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。⑵深拷贝(深克隆)   复制出来的所有变量都含有与原来的对象相同的值,那些引用其他对象的变量将指向复制出来的新对象,而不再是原有的那些被引用的对象。换言之,深复制