【前端】浅拷贝和深拷贝

136 阅读1分钟

定义

  • 1 要弄明白这俩的区别首先的明白数据分为基本数据类型 (Number,String,Boolean,Undefined,Null,Symbol)和 对象数据类型(所有引用数据皆为对
    象,Array,Object,Function,Date,RegExp)。
  • 2 基本数据类型的特点:直接存在栈中。
  • 3 引用数据类型的特点:存储的是该对象在栈中的引用,真实数据保存在堆里。
  • 4 数组,对象,函数这些,存的都是一个内存地址,数组,对象,函数,日期这些引用类型在栈中储存的是指 针。实际指向一个内存地址,浅拷贝其实就是拷贝的内存地址,浅拷贝只会改变第一层的内存地址,后面的不变, 深拷贝就是每层地址都会改变。

浅拷贝和赋值的区别

  1. 当我们把对象赋值给另一个变量时,这时其实是赋的是该对象在栈中的地址,也就是两个对象指向同一个内存 地址,改一个另一个也会修改。
  2. 浅拷贝只会改变第一层的数据,后面的内存地址新旧对象都是一致的,改一个会影响另一个。
赋值:

image.png

fuzhi.png

浅拷贝:

image.png image.png

`//浅拷贝
function shallowClone(param){
    let result = Array.isArray(param) ? [] : {};
    for(const key in param) {
        result[key] = param[key];
    }
    return result;
}
//深拷贝
function deepClone(param, map = new Map()) {
    if(typeof param === 'object'){
        if(map.get(param)){
            return map.get(param);
        }
        let result = Array.isArray(param) ? [] : {};
        map.set(param, result);
        for(const key in param){
            result[key] = deepClone(param[key], map);
        }
    }
    else{
        return param
    }
}`