理解深淺拷貝以及深淺拷貝的方法

????????先考慮一種情況,對一個已知對象進(jìn)行拷貝,編譯系統(tǒng)會自動調(diào)用一種構(gòu)造函數(shù)——拷貝構(gòu)造函數(shù),如果用戶未定義拷貝構(gòu)造函數(shù),則會調(diào)用默認(rèn)拷貝構(gòu)造函數(shù)

執(zhí)行結(jié)果:調(diào)用一次構(gòu)造函數(shù),調(diào)用兩次析構(gòu)函數(shù),兩個對象的指針成員所指內(nèi)存相同,name指針被分配一次內(nèi)存,但是程序結(jié)束時該內(nèi)存卻被釋放了兩次,會造成內(nèi)存泄漏問題!

這是由于編譯系統(tǒng)在我們沒有自己定義拷貝構(gòu)造函數(shù)時,會在拷貝對象時調(diào)用默認(rèn)拷貝構(gòu)造函數(shù),進(jìn)行的是淺拷貝!即對指針name拷貝后會出現(xiàn)兩個指針指向同一個內(nèi)存空間。

所以,在對含有指針成員的對象進(jìn)行拷貝時,必須要自己定義拷貝構(gòu)造函數(shù),使拷貝后的對象指針成員有自己的內(nèi)存空間,即進(jìn)行深拷貝,這樣就避免了內(nèi)存泄漏發(fā)生。

執(zhí)行結(jié)果:調(diào)用一次構(gòu)造函數(shù),一次自定義拷貝構(gòu)造函數(shù),兩次析構(gòu)函數(shù)。兩個對象的指針成員所指內(nèi)存不同。

總結(jié):淺拷貝只是對指針的拷貝,拷貝后兩個指針指向同一個內(nèi)存空間,深拷貝不但對指針進(jìn)行拷貝,而且對指針指向的內(nèi)容進(jìn)行拷貝,經(jīng)深拷貝后的指針是指向兩個不同地址的指針。

深拷貝方法:

? ? ? ? ? ?1. 使用JSON.parse()與JSON.stringify()對對象進(jìn)行拷貝

????????????????通常情況下,我們可以使用JSON.parse()與 JSON.stringify()實現(xiàn)對象的深克隆,如下:

????????????????var clone = function (obj) {

? ? ????????????return JSON.parse(JSON.stringify(obj));

????????????????}? ? ? ? //這種方法只適用于純數(shù)據(jù)json對象的深度克隆,因為有些時候,這種方法也有缺陷

? ? ? ? ? ? 2.目前沒有發(fā)現(xiàn)bug的對象深拷貝方法

? ? ? ? ? ? ?var clone = function (obj) {

? ????????????????? if(obj === null) return null

? ????????????????? if(typeof obj !== 'object') return obj;

? ????????????????? if(obj.constructor===Date) return new Date(obj);

????????? ????????? if(obj.constructor === RegExp) return new RegExp(obj);

? ? ? ? ? ? ? ? ? ? ?var newObj = new obj.constructor ();? //保持繼承鏈

? ????????????????? for (var key in obj) {

? ? ????????? ????????????? if (obj.hasOwnProperty(key)) {? //不遍歷其原型鏈上的屬性

? ? ????????????????? ? ? ? var val = obj[key];

? ? ? ????????????????? ? ? newObj[key] = typeof val === 'object' ? arguments.callee(val) : val; // 使用arguments.callee解除與函數(shù)名的耦合

? ? ? ? ? ????????????? ? ?}

????????????? ? }?

? ????????????? return newObj;?

????????};

3.展開運算符進(jìn)行淺拷貝

? ? ? ? var arr1=[1,2,5,6,4];

? ? ? ? var arr2=[...arr1];

? ? ? ? arr1 == arr2? ? ? // false;

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

相關(guān)閱讀更多精彩內(nèi)容

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML標(biāo)準(zhǔn)。 注意:講述HT...
    kismetajun閱讀 28,819評論 1 45
  • 第一章 錯誤處理: 錯誤: 程序運行過程中,導(dǎo)致程序無法正常執(zhí)行的現(xiàn)象(即bug) 現(xiàn)象: 程序一旦出錯,默認(rèn)會報...
    fastwe閱讀 1,253評論 0 1
  • 面試題參考1 : 面試題[http://www.cocoachina.com/ios/20150803/12872...
    江河_ios閱讀 1,817評論 0 4
  • 1.設(shè)計模式是什么? 你知道哪些設(shè)計模式,并簡要敘述?設(shè)計模式是一種編碼經(jīng)驗,就是用比較成熟的邏輯去處理某一種類型...
    龍飝閱讀 2,302評論 0 12
  • 函數(shù)和對象 1、函數(shù) 1.1 函數(shù)概述 函數(shù)對于任何一門語言來說都是核心的概念。通過函數(shù)可以封裝任意多條語句,而且...
    道無虛閱讀 4,950評論 0 5

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