浅拷贝与深拷贝深层解析以及使用方法
作者:互联网
引言:什么是基本类型值和引用类型值
基本数据类型(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'
}]
深拷贝的实现方式:
方法一:层级拷贝,递归实现。
方法二:JSON解析
b = JSON.parse(JSON.stringify(a))
方法的缺点:无法复制函数。
标签:对象,数据类型,深层,内存,复制,拷贝,解析,引用 来源: https://www.cnblogs.com/zlnbk/p/16030646.html