【JS】深拷貝與淺拷貝的區(qū)別,實現(xiàn)的方法

如何區(qū)分深拷貝與淺拷貝器瘪,簡單點來說又谋,就是假設B復制了A,當修改A時娱局,看B是否會發(fā)生變化,如果B也跟著變了咧七,說明這是淺拷貝衰齐,拿人手短,如果B沒變继阻,那就是深拷貝耻涛,自食其力废酷。


怎么去實現(xiàn)?抹缕?澈蟆??卓研?趴俘??奏赘?寥闪??磨淌?疲憋??梁只?缚柳?


1.JSON方法實現(xiàn)

//_tmp和result是相互獨立的,沒有任何聯(lián)系搪锣,有各自的存儲空間秋忙。

let deepClone = function (obj) {

    let _tmp = JSON.stringify(obj);//將對象轉(zhuǎn)換為json字符串形式

    let result = JSON.parse(_tmp);//將轉(zhuǎn)換而來的字符串轉(zhuǎn)換為原生js對象

    return result;

};

let obj1 = {

    weiqiujaun: {

        age: 20,

        class: 1502

    },

    liuxiaotian: {

        age: 21,

        class: 1501

    }

};

let test = deepClone(obj1);

console.log(test);

2.用for…in實現(xiàn)遍歷和復制

function deepClone(obj) {

    let result = typeof  obj.splice === "function" ? [] : {};

    if (obj && typeof obj === 'object') {

        for (let key in obj) {

            if (obj[key] && typeof obj[key] === 'object') {

                result[key] = deepClone(obj[key]);//如果對象的屬性值為object的時候,遞歸調(diào)用deepClone,即在吧某個值對象復制一份到新的對象的對應值中淤翔。

            } else {

                result[key] = obj[key];//如果對象的屬性值不為object的時候翰绊,直接復制參數(shù)對象的每一個鍵值到新的對象對應的鍵值對中。

            }

        }

        return result;

    }

    return obj;

}

let testArray = ["a", "b", "c", "d"];

let testRes = deepClone(testArray);

console.log(testRes);

console.log(typeof testRes[1]);

let testObj = {

    name: "weiqiujuan",

    sex: "girl",

    age: 22,

    favorite: "play",

    family: {brother: "son", mother: "haha", father: "heihei"}

};

let testRes2 = deepClone(testObj);

testRes2.family.brother = "weibo";

console.log(testRes2);

3.利用數(shù)組的Array.prototype.forEach進copy


let deepClone = function (obj) {

    let copy = Object.create(Object.getPrototypeOf(obj));

    let propNames = Object.getOwnPropertyNames(obj);

    propNames.forEach(function (items) {

        let item = Object.getOwnPropertyDescriptor(obj, items);

        Object.defineProperty(copy, items, item);

    });

    return copy;

};

let testObj = {

    name: "weiqiujuan",

    sex: "girl",

    age: 22,

    favorite: "play",

    family: {brother: "wei", mother: "haha", father: "heihei"}

}

let testRes2 = deepClone(testObj);

console.log(testRes2);

4.淺拷貝(使用object.assign方法)


let target=[];

let testArr=[2,3,5,8];

Object.assign(target,testArr);

console.log(target);

testArr.push(8);

console.log("我是原來的"+target+",我是現(xiàn)在的"+testArr);

5旁壮、lodash函數(shù)庫實現(xiàn)深拷貝

lodash很熱門的函數(shù)庫监嗜,提供了 lodash.cloneDeep()實現(xiàn)深拷貝 ??傳送門https://www.lodashjs.com/

參考:聽風是風

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抡谐,隨后出現(xiàn)的幾起案子裁奇,更是在濱河造成了極大的恐慌,老刑警劉巖麦撵,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刽肠,死亡現(xiàn)場離奇詭異,居然都是意外死亡免胃,警方通過查閱死者的電腦和手機音五,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羔沙,“玉大人躺涝,你說我怎么就攤上這事《蟪” “怎么了坚嗜?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵夯膀,是天一觀的道長。 經(jīng)常有香客問我苍蔬,道長诱建,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任碟绑,我火速辦了婚禮俺猿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蜈敢。我一直安慰自己辜荠,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布抓狭。 她就那樣靜靜地躺著伯病,像睡著了一般。 火紅的嫁衣襯著肌膚如雪否过。 梳的紋絲不亂的頭發(fā)上午笛,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音苗桂,去河邊找鬼药磺。 笑死,一個胖子當著我的面吹牛煤伟,可吹牛的內(nèi)容都是我干的癌佩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼便锨,長吁一口氣:“原來是場噩夢啊……” “哼围辙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起放案,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤姚建,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后吱殉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掸冤,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年友雳,在試婚紗的時候發(fā)現(xiàn)自己被綠了稿湿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡押赊,死狀恐怖缎罢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤策精,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站崇棠,受9級特大地震影響咽袜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜枕稀,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一询刹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萎坷,春花似錦凹联、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瓜浸,卻和暖如春澳淑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背插佛。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工杠巡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雇寇。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓氢拥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親锨侯。 傳聞我的和親對象是個殘疾皇子嫩海,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容