深淺拷貝

JS中的變量類型分為值類型(基本類型)和引用類型;對值類型進(jìn)行復(fù)制操作會對值進(jìn)行一份拷貝,而對引用類型賦值,則會進(jìn)行地址的拷貝,最終兩個變量指向同一份數(shù)據(jù)。

一、 淺拷貝
對象只會被克隆最外部的一層,至于更深層的對象,則依然是通過引用指向同一塊堆內(nèi)存.

實(shí)現(xiàn)

  1. 現(xiàn)有方法
    數(shù)組的淺拷貝:slice、concat
    對象的淺拷貝:Object.assign()
  2. 實(shí)現(xiàn)方法
var shallowCopy = function(obj) {
    if (typeof obj !== 'object') return;
    // 判斷是新建一個數(shù)組還是對象
    var newObj = obj instanceof Array ? [] : {};
    // 遍歷obj,并且判斷是obj的屬性才拷貝
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = obj[key];
        }
    }
    return newObj;
}

二、深拷貝
實(shí)現(xiàn)

  1. JSON.parse方法
JSON.parse(JSON.stringify(obj));
  1. 實(shí)現(xiàn)方法
var deepCopy = function(obj) {
    if (typeof obj !== 'object') return;
    var newObj = obj instanceof Array ? [] : {};
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            newObj[key] = typeof obj[key] === 'object' ? deepCopy(obj[key]) : obj[key];
        }
    }
    return newObj;
}

限制:
無法實(shí)現(xiàn)對函數(shù) 、RegExp等特殊對象的克隆
會拋棄對象的constructor,所有的構(gòu)造函數(shù)會指向Object
對象有循環(huán)引用,會報錯

參考資料:
https://juejin.im/post/5abb55ee6fb9a028e33b7e0a

https://github.com/mqyqingfeng/Blog/issues/32

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容