JS深拷贝和浅拷贝

101 阅读1分钟

1.变量分为基本数据类型和引用数据类型

基本数据类型:String、Number、Boolean、Underfind、Null、Symbol,存储在内存的栈中
引用数据类型:Object、Array、Function,存储在内存的堆中

2.内存存储图解

a.基本数据类型--名值存储在栈内存中,如let a=1
image.png
b.当b=a时,新开了一个内存,所以此时此刻,修改a的值对b的值不影响
image.png

引用数据类型--名存在栈内存中,值存在堆内存中,栈内存会提供一个指针指向堆内存的值
image.png 当b=a进行拷贝时,其实复制的是a的引用地址,而并非堆里面的值
image.png 当修改a[0]='10',b中的值也会改变,此时此刻b对a就是浅拷贝
image.png 如果想避免这种问题,就需要给b开辟一个新的内存地址,就是要用到深拷贝
image.png

3.实现方式

1.递归函数

function deepClone(obj) {
    var cloneInfo = Array.isArray(obj)?[]:{}
    for (var k in obj) {
        if (obj.hasOwnProperty(k)) {
            if (obj[k] && typeof obj[k] == 'object') {
                cloneInfo[k] = Array.isArray(obj[k])?[]:{}
                cloneInfo[k] = deepClone(obj[k])                
            } else {
                cloneInfo[k] = obj[k]
            }
        }
    }
    return cloneInfo;
}

2.序列化和反序列化

var jsonObj = JSON.stringify(obj)
jsonObj = JSON.parse(jsonObj)

3.Object.assign

var assignObj = Object.assign({},obj)
这里有一个提示,如果是对象的一级属性是深拷贝,更改数据后拷贝的数据没有影响,但是二级属性属于浅拷贝,会被影响

4.lodash插件