深拷贝,浅拷贝

130 阅读1分钟

在js中,有两种数据类型

原始数据类型:string,number,boolean,undefined,null,它们的值存在栈中。

引用数据类型:object,array,它们的值,存在于堆中,它们的指针地址,存在栈中。

浅拷贝:只复制指向某个对象的指针,并不复制对象本身,新旧对象仍旧共享同一个内存,当新对象改变值时,原对象的值也会改变。

深拷贝:复制对象本身,创造出一个一模一样的对象,新旧对象的值互相不影响。

Object.assign({},obj):浅拷贝,对象第一层是深拷贝,对象的属性如果仍是引用数据类型,将会被浅拷贝。

JONS.parse(JSON.stringify()):深拷贝,但对function类型无用,拷贝后变为null。

手写深拷贝方式:

// 检测数据类型
function checkType(target){
    return Object.prototype.toString.call(target).slice(8,-1)
}
function clone(target){
   // 如果不是引用数据类型,返回原值
    if(checkType(target) !== 'Array' && checkType(target) !== 'Object'){
        return target
    }
    // 利用构造函数,创建一个该类型的对象
    var result = new target.constructor
    for(var i in target){
        var val = target[i]
        // 递归拷贝
        result[i] = clone(val)
    }
    // 返回拷贝后的值
    return result
}