1. 程式人生 > 實用技巧 >陣列和物件的深淺克隆

陣列和物件的深淺克隆

克隆obj

Object.assign():物件合併,實現物件的淺克隆

畫圖理解

物件展開運算子

{...obj},展開運算子,也只能展開第一級,也是淺克隆。

let newObj = {
...obj
}

深克隆 json.parse(json.stringify())

封裝一個深克隆函式

程式碼啊

let obj = {
    a:11,
    b:[1,2,3],
    c:{x:11},
    s:function(){},
    d:/^\d+$/,
    e:new Date()
}

function clonedeep(obj){
    const constructor = obj.constructor;
    if (obj === null) return null;
    if(typeof obj !== "object") return obj;
    if(/^(RegExp|Date)$/i.test(constructor.name)) return new constructor(obj)
    let clone = new constructor()
    for(let key in obj){
        if(!obj.hasOwnProperty(key)) break;
        clone[key] = clonedeep(obj[key])
    }
    return clone
}

let newobj = clonedeep(obj)
console.log(obj,newobj)
console.log(newobj === obj)  //false
console.log(newobj.b === obj.b)  //false
console.log(newobj.c === obj.c) //false
console.log(newobj.d === obj.d) //false
console.log(newobj.s === obj.s)