JavaScript的一些思考,關(guān)于深拷貝和淺拷貝

最近在研究lodash的源碼沛硅,涉及到深 拷貝和淺拷貝的問(wèn)題眼刃,由此,搜集網(wǎng)上的資料來(lái)研究了一番摇肌。

  • 共同點(diǎn): 都是在已有對(duì)象的基礎(chǔ)上拷貝一份擂红。
  • 不同點(diǎn): 拷貝實(shí)例,還是拷貝引用
    ??首先分析兩者的共同點(diǎn)和不同點(diǎn)朦蕴。首先篮条,深拷貝和淺拷貝都是基于一些復(fù)雜的數(shù)據(jù)類型弟头,比如Object和Array吩抓,如果是基礎(chǔ)數(shù)據(jù)類型,number赴恨,boolean等疹娶,就沒(méi)什么區(qū)別了,這和引用類型和基礎(chǔ)類型所在內(nèi)存區(qū)域是堆內(nèi)存還是棧內(nèi)存有關(guān)伦连。
    ??淺拷貝和深拷貝斗仙得分清是拷貝引用還是拷貝實(shí)例
 var obj = {
     a: 1,
     b: 2,
 } 
 var obj1 = {}
 function simplecopy(p, c) {
     var c = c || {}
     for(var key in p) {
         c[key] = p[key]
     }
 }
 simplecopy(obj, obj1)
 obj1.a=3
 console.log(obj.a) //1
 console.log(obj1.a) //3
 console.log(obj === obj1) //false
 console.log(obj.a === obj1.a) //false

以上就是拷貝實(shí)例雨饺,拷貝實(shí)例就是給新的對(duì)象分配一個(gè)新的內(nèi)存空間,所以兩個(gè)變量互不干擾惑淳,值類型额港,就是基礎(chǔ)數(shù)據(jù)類型,simplecopy函數(shù)中把a(bǔ)和b兩個(gè)基礎(chǔ)數(shù)據(jù)類型歧焦,拷貝給了對(duì)象C移斩,相當(dāng)于重新分配了兩個(gè)空間,所以绢馍,obj1和obj2以及其對(duì)象都是指向兩種不同的地址向瓷。所以,===為false舰涌。

var str1 =  {a: 1, b: 2 }
 var str2 = str1

 str2.a = 3
 console.log(str1.a) // 3
 console.log(str2.a) // 3
 console.log(str1.a === str2.a) //true

以上就是拷貝引用猖任,因?yàn)閟tr1和str2都是對(duì)象,是引用類型瓷耙。str2=str1朱躺,實(shí)際上是將str2指向str1的應(yīng)用的地址刁赖,所以,str1和str2其指向的是同一塊內(nèi)存地址长搀,所以乾闰,改變其值,就會(huì)互相干擾盈滴。


淺拷貝

淺拷貝分成兩類.

  • 一個(gè)是簡(jiǎn)單的引用拷貝涯肩,這個(gè)簡(jiǎn)單,普通的賦值就可以了巢钓。
  • 還有一個(gè)是源對(duì)象拷貝實(shí)例病苗,其嵌套有子對(duì)象的話,就是拷貝引用
    ??如果一個(gè)對(duì)象沒(méi)有嵌套子對(duì)象的話症汹,那么就是源對(duì)象的實(shí)例拷貝硫朦,這里自己寫了一個(gè)淺拷貝方法,就是上文的simplecopy,上文的obj1和obj2都是沒(méi)有嵌套子對(duì)象的對(duì)象背镇,它的屬性就是基本數(shù)據(jù)類型咬展,所以,它的拷貝就是實(shí)例拷貝瞒斩,兩個(gè)對(duì)象指向不同的地址破婆,其屬性也指向不同的地址。但是如果胸囱,一個(gè)對(duì)象嵌套了一個(gè)子對(duì)象祷舀,對(duì)其子對(duì)象進(jìn)行賦值,那么就是烹笔,引用賦值裳扯,指向的是同一個(gè)地址。
var stu1 = {
     name: "xiaoming",
     info: {
         score: 12,
         school: "第一小學(xué)"
     }
 }
var stu2 = {}
 simplecopy(stu1, stu2)
 console.log(stu1)
 console.log(stu2)
 stu2.info.score = 21
 console.log(stu1)  // 其中的info.score值是21
 console.log(stu1)  // 其中的info.score值是21
testpng.png

深拷貝

至于深拷貝谤职,簡(jiǎn)單說(shuō)就是彌補(bǔ)了淺拷貝的缺憾饰豺,將被拷貝對(duì)象中的子對(duì)象遍歷一遍,賦值給空對(duì)象允蜈,然后在進(jìn)行淺拷貝冤吨,原理就是這樣,上段代碼

function deepCopy(p, c) {
     var c = c || {}
     for(var i in p) {
         if(typeof p[i] === 'object') {
             c[i] = (p[i].constructor === 'Array' ? [] : {})
             deepCopy(c[i], p[i])
         } else {
             c[i] = p[i]
         } 
     }
 }
 deepCopy(stu1, stu2)
 console.log(stu1)
 console.log(stu2)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末陷寝,一起剝皮案震驚了整個(gè)濱河市锅很,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌凤跑,老刑警劉巖爆安,帶你破解...
    沈念sama閱讀 221,888評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異仔引,居然都是意外死亡扔仓,警方通過(guò)查閱死者的電腦和手機(jī)褐奥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)翘簇,“玉大人撬码,你說(shuō)我怎么就攤上這事“姹#” “怎么了呜笑?”我有些...
    開封第一講書人閱讀 168,386評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)彻犁。 經(jīng)常有香客問(wèn)我叫胁,道長(zhǎng),這世上最難降的妖魔是什么汞幢? 我笑而不...
    開封第一講書人閱讀 59,726評(píng)論 1 297
  • 正文 為了忘掉前任驼鹅,我火速辦了婚禮,結(jié)果婚禮上森篷,老公的妹妹穿的比我還像新娘输钩。我一直安慰自己,他們只是感情好仲智,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評(píng)論 6 397
  • 文/花漫 我一把揭開白布买乃。 她就那樣靜靜地躺著,像睡著了一般坎藐。 火紅的嫁衣襯著肌膚如雪为牍。 梳的紋絲不亂的頭發(fā)上哼绑,一...
    開封第一講書人閱讀 52,337評(píng)論 1 310
  • 那天奠滑,我揣著相機(jī)與錄音蛾洛,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛盹兢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睦优,決...
    沈念sama閱讀 40,902評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼返干,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了席揽?” 一聲冷哼從身側(cè)響起顽馋,我...
    開封第一講書人閱讀 39,807評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幌羞,沒(méi)想到半個(gè)月后寸谜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,349評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡属桦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評(píng)論 3 340
  • 正文 我和宋清朗相戀三年熊痴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了他爸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡果善,死狀恐怖诊笤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情巾陕,我是刑警寧澤讨跟,帶...
    沈念sama閱讀 36,242評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站鄙煤,受9級(jí)特大地震影響许赃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜馆类,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評(píng)論 3 334
  • 文/蒙蒙 一混聊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乾巧,春花似錦句喜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至旷太,卻和暖如春展懈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背供璧。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工存崖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人睡毒。 一個(gè)月前我還...
    沈念sama閱讀 48,995評(píng)論 3 377
  • 正文 我出身青樓来惧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親演顾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子供搀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評(píng)論 2 359

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