浅拷贝与深拷贝之间的区别

拷贝,拷贝字面意思就算cope,我们要将一个或者一些数据为模板复制到另一个新数据中,怎么复制呢,在这之前我们要知道js数据是怎样存储的,才能进行更清晰的知道下一步复制是如何操作的

首先:

数据分为基本数据类型(String(字符串), Number(数字), Boolean(布尔), Null, Undefined,NAN)和引用数据类型。

基本数据类型:是指直接存储在栈中的数据

引用数据类型:存储的是,该对象在栈中的地址,真实的数据存放在堆内存里


对于浅拷贝

1.浅拷贝只会复制上图中的栈内存,所以对于对象来说,只会复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。

2.如果属性是基本类型,拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,那么另外一个拷贝或者背拷贝对象也会发生改变。

例:

var arr1 = ['red','pink'];

var arr2 = arr1;//cope

console.log(arr2)//['red','pink'];

arr1.push('black') ;//改变arr1的值

console.log(arr2)//['red','pink','black']

console.log(arr1)//["red", "pink", "black"]

对于深拷贝

深拷贝必须是cope对方的每一个基本数据类型的新对象,新对象跟原对象不共享内存,修改新对象不会改变原对象,修原对象也不会改变新对象,完完全全的是俩个独立占用内存的对象。

例:

var arr1 = ['red','pink'];

var arr2=[]

for(var key in arr1){

var arr2.push(key); 复制

}

console.log(arr2)//['red','pink'];

arr1.push('black') ;//改变arr1的值

console.log(arr2)//['red','pink']

console.log(arr1)//["red", "pink", "black"]



深拷贝有许多方法:例如

 for循环(最不可取)

jquery的$.extend方法(非常适用)

JSON中的

JSON.stringify(obj)

JSON.parse(_obj)

(弊端无法cope对象中的方法)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容