1. 程式人生 > >7.JS之深淺拷貝

7.JS之深淺拷貝

1.深拷貝與淺拷貝的區別

如何區分深拷貝與淺拷貝,簡單點來說,就是假設B複製了A,當修改A時,看B是否會發生變化,如果B也跟著變了,說明這是淺拷貝,拿人手短,如果B沒變,那就是深拷貝,自食其力。

2.棧堆、基本資料型別、引用資料型別 棧堆:存放資料的地方 基本資料型別:number,string,boolean,null,undefined. 引用資料型別(Object類)有常規名值對的無序物件{a:1},陣列[1,2,3],以及函式等。

3.淺拷貝

let a= [0,1,2,3,4],b=a;
console.log(a===b);
a[0] = 1
console.log(a,b)

clipboard.png

3.深拷貝

function deepClone(obj){
    let objClone = Array.isArray(obj)?[]:{};
    if(obj && typeof obj==="object"){
        for(key in obj){
            if(obj.hasOwnProperty(key)){
                //判斷ojb子元素是否為物件,如果是,遞迴複製
                if(obj[key]&&typeof obj[key] ==="object"){
                    objClone[key] = deepClone(obj[key]);
                }else{
                    //如果不是,簡單複製
                    objClone[key] = obj[key];
                }
            }
        }
    }
    return objClone;
} 
 
let a=[1,2,3,4],b=deepClone(a);
a[0]=2;
console.log(a,b);

clipboard.png

4.引用型別和基本型別棧記憶體儲

4.1基本型別

clipboard.png

4.2引用型別

clipboard.png