js 浅拷贝和深拷贝
ecmajcript 存在两种不同的数据类型的值 基本数据类型和引用数据类型
基本数据类型,键值对储存在栈内存中。(string,number,boolean, null,undefined)
引用数据类型,键存在与栈内存中,值存在与堆内存中。栈内存会提供一个指向堆内存的引用地址。(object, array)
概念简介
浅拷贝:指传址拷贝,拷贝的过程中只拷贝了存于栈中的地址,当修改拷贝对象时,由于指向地址相同,被拷贝对象也会改变。
深拷贝:相当于在堆中重新开辟空间,将拷贝对象堆中存储的所有数据存入新开辟的堆空间中,拷贝之后的对象相当于新对象,当被拷贝对象发生改变时拷贝对象不会改变。(深拷贝只针对结构比较复杂的object类型)
浅拷贝实现方法
for in 语句只会便利出对象第一层数据,如果对象有多层结构,则对象中的对象会是浅拷贝,只拷贝对象地址。
Object.assgin(target, source) object.assgin 有两个参数,第一个是目标对象,第二个参数是源对象,将源对象的所有属性分配给目标对象,并返回目标对象。
赋值,使用=赋值也属于浅拷贝。
对象的深拷贝实现方法
使用递归遍历拷贝所有的层级属性。(object.hasOwnProperty(key) 检测对象object中是否含有key,返回一个boolean值)
将object转换成json字符串,进行拷贝。利用JSON.Stringify(obj),然后使用JSON.parse()将json字符串转换成obj类型。(无法将对象中的function转换,function将会被识别为undefined。)
数组的深拷贝实现方法
使用扩展运算符实现深拷贝,
使用slice, concat对一维数组实现深拷贝。