其他分享
首页 > 其他分享> > 浅拷贝与深拷贝深层解析以及使用方法

浅拷贝与深拷贝深层解析以及使用方法

作者:互联网

引言:什么是基本类型值和引用类型值

基本数据类型(Undefined,Null,String,Number,Boolean, Symbol(es6新增))
引用数据类型指可能由多个值组成的对象(如 Object,Array,Function等)

基本数据类型特点:直接存储在桟中的数据。
引用数据类型特点:变量存储在桟内存,存储的是指向堆内存的引用地址即指针,真实数据存放在堆内存中。

普通复制(使用“=” 来实现)

基本数据类型复制:名值都存在栈内存中。复制的时候,栈内存会新开辟一个内存。所以新老互不影响。

引用数据类型类型复制:复制了存储在桟上的引用地址,即复制了指针,存储在堆内存的数据并没得到复制。所以新老对象会出现联动现象。
引用数据类型,我们调用数据的时候都是通过地址(指针)来调用数据。

浅拷贝与深拷贝

只针对引用数据类型,如Object,Array, Function等。
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

浅拷贝: 按位拷贝,它会创建一个新的对象,这个新的对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,那么拷贝的就是基本类型的值;如果属性是引用类型,拷贝的就是引用地址,因此其中一个对象改变了这个地址,就会影响到另一个对象。
深拷贝: 会创建独立堆内存,将内容一一拷贝。两者互不影响。

浅拷贝的实现方式:

Object.assign()
Array.concat()
Array.slice()
[...Array]

例如1:
var a = [1,2,3];
var b = a.slice()
// var b = a.concat()
// var b = [...a]
b.push(4)
console.log(a)
console.log(b)
都会得到 a为 [1, 2, 3]
b为[1, 2, 3, 4]

例如2
let arr = [1, 3, {
username: 'kobe'
}];
let arr2=arr.concat();
arr2[0] = '99';
arr2[2].username = 'wade';
console.log(arr);
得到arr
[1, 3, {
username: 'wade'
}]

深拷贝的实现方式:

方法一:层级拷贝,递归实现。

image

方法二:JSON解析
b = JSON.parse(JSON.stringify(a))
方法的缺点:无法复制函数。

标签:对象,数据类型,深层,内存,复制,拷贝,解析,引用
来源: https://www.cnblogs.com/zlnbk/p/16030646.html