深拷贝与浅拷贝

276 阅读1分钟

深拷贝与浅拷贝的区别在哪里呢?

要想搞清楚这个问题,必须要清楚数据类型,js中分为2种数据类型,

基本数据类型(number,string,boolean,null,undefined)

基本数据类型是保存在栈区的,是一个大小固定的内存区域

引用类型(function,object,array,date)

引用类型是保存在堆区的,是大小不固定的内存区域,然后在栈区中保存对应对象在堆区的地址,用白话说就是,引用类型在栈区保存的是堆区的地址指针,其真正的内容数据是保存在堆区的

那么,到这里就可以谈谈深拷贝与浅拷贝的区别了,

浅拷贝:比如是一个引用类型,就是拷贝其在栈区的地址指针

比如:

let obj = {a:1,b:2};
let copyObj = obj;

obj与copyObj都是指向同一堆区的地址,就是说如果改变obj,copyObj也跟着发生改变

深拷贝: 就是讲起堆区的数据一并复制,得到两个完全独立的变量,改变其中一个不会影响另外一个。

 function deepClose(obj) {
        let newObj = obj instanceof Array ? [] : {};
        if (typeof obj !== "object") {
            return obj;
        }else {
            // obj 是数组或者是对象,遍历复制
            for (let i in obj) {
                newObj[i] = typeof obj[i] ==="object" ?  deepClose(obj[i]) : obj[i];
            }
        }
        return newObj;
    }