js中的深拷貝和淺拷貝

之所有寫這篇文章,是因?yàn)榍皫滋煸陧?xiàng)目中被ES6的assign坑了襟企,后來自己查閱了些資料,覺得有必要總結(jié)下寝凌。

淺拷貝

平常我們把字符串柒傻,數(shù)字的值賦值給新變量,相當(dāng)于把值完全復(fù)制過去较木,新變量的值改變不會(huì)影響舊變量红符,

let num = 123
let num2 = num
num2 = 321
console.log(num) //123
console.log(num2) //321

但是對象卻不同

let obj = { name: '程序猿' }
let obj2 = obj
obj2.name = '單身狗'
console.log(obj) //{ name: '單身狗' }

因?yàn)槎际且玫耐粋€(gè)地址,所以你變他也變(0.0 真是調(diào)皮)

ES6出來后伐债,新增了Object.assign 用來復(fù)制對象预侯,嗯~~~來試試

let obj = { name: '程序猿', age:{child: 12} }
let copy = Object.assign({}, obj);
copy.name = '單身狗'
copy.age.child = 24
console.log(obj) // { name: '程序猿', age:{child: 24} }

嗯~~~不錯(cuò),程序猿還沒變成單身狗峰锁,納尼child怎么變成24了萎馅,我怕是用了假的ES6吧
查了查MDN,才發(fā)現(xiàn)自己對Object.assign的一點(diǎn)都不了解虹蒋,就亂用糜芳,真是自己作死

20170319112551.png

簡單說就是如果拷貝的對象的屬性值也是一個(gè)引用(對象)飒货,就只會(huì)把引用給拷貝過來。而且這貨用的最多的地方不是淺拷貝而是將多個(gè)對象的屬性合并到一個(gè)對象上

Object.assign( target, obj1, obj2 )

第一個(gè)參數(shù)是目標(biāo)對象峭竣,后面的都是源對象塘辅,將源對象的屬性復(fù)制到目標(biāo)對象中

深拷貝

既然沒有現(xiàn)成的深拷貝的方法,那有哪些方式可以達(dá)到深拷貝呢皆撩?

對象的賦值會(huì)相互影響扣墩,而數(shù)字,字符串之類的不會(huì)扛吞,我們將對象逐漸遍歷呻惕,在數(shù)字,字符串將其對應(yīng)賦值喻粹,這就是一般深拷貝的方式

function cloneDeep(obj){
            if( typeof obj !== 'object' || Object.keys(obj).length === 0 ){
                return obj
            }
            let resultData = {}
            return recursion(obj, resultData)
        }

function recursion(obj, data={}){
            for(key in obj){
                if( typeof obj[key] == 'object' && Object.keys(obj[key].length>0 )){
                    data[key] = recursion(obj[key])
                }else{
                    data[key] = obj[key]
                }
            }
            return data
        }
let obj = {name:'程序猿',age:{child:20}}
let obj2 = cloneDeep(obj)
obj.name = '單身狗'
obj2.age.child = 24
console.log(obj) // {name:'程序猿',age:{child:20}}

一長串的看起來好麻煩啊蟆融,我只是想深拷貝個(gè)對象啊
這里有一種取巧的方式就是使用json轉(zhuǎn)換,

let h = JSON.parse(JSON.stringify(a));

這里是將對象轉(zhuǎn)化為json字符串又轉(zhuǎn)換為json對象守呜,之前什么引用的全變了樣兒型酥,不過弊端也是有的,繼承的屬性會(huì)丟失

這里推薦使用Lodash類庫

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末查乒,一起剝皮案震驚了整個(gè)濱河市弥喉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌玛迄,老刑警劉巖由境,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蓖议,居然都是意外死亡虏杰,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門勒虾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纺阔,“玉大人,你說我怎么就攤上這事修然〉讯郏” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵愕宋,是天一觀的道長玻靡。 經(jīng)常有香客問我,道長中贝,這世上最難降的妖魔是什么囤捻? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮雄妥,結(jié)果婚禮上最蕾,老公的妹妹穿的比我還像新娘依溯。我一直安慰自己,他們只是感情好瘟则,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布黎炉。 她就那樣靜靜地躺著,像睡著了一般醋拧。 火紅的嫁衣襯著肌膚如雪慷嗜。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天丹壕,我揣著相機(jī)與錄音庆械,去河邊找鬼。 笑死菌赖,一個(gè)胖子當(dāng)著我的面吹牛缭乘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琉用,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼堕绩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了邑时?” 一聲冷哼從身側(cè)響起奴紧,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晶丘,沒想到半個(gè)月后黍氮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浅浮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年沫浆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片滚秩。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡件缸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叔遂,到底是詐尸還是另有隱情,我是刑警寧澤争剿,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布已艰,位于F島的核電站,受9級特大地震影響蚕苇,放射性物質(zhì)發(fā)生泄漏哩掺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一涩笤、第九天 我趴在偏房一處隱蔽的房頂上張望嚼吞。 院中可真熱鬧盒件,春花似錦、人聲如沸舱禽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誊稚。三九已至翔始,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間里伯,已是汗流浹背城瞎。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留疾瓮,地道東北人脖镀。 一個(gè)月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像狼电,于是被迫代替她去往敵國和親蜒灰。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

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

  • 一漫萄、深拷貝與淺拷貝 深拷貝和淺拷貝只針對Object,Array這些復(fù)雜的引用對象卷员。淺拷貝,只復(fù)制對象的引用的地址...
    芒果加奶閱讀 537評論 0 1
  • 1.屬性的簡潔表示法 允許直接寫入變量和函數(shù) 上面代碼表明腾务,ES6 允許在對象之中毕骡,直接寫變量。這時(shí)岩瘦,屬性名為變量...
    雨飛飛雨閱讀 1,135評論 0 3
  • 在 JS 中有一些基本類型像是Number未巫、String、Boolean启昧,而對象就是像這樣的東西{ name: '...
    tobAlier閱讀 563評論 0 0
  • 值類型與引用類型 談淺拷貝與深拷貝之前叙凡,我們需要先理清一個(gè)概念,即值類型與引用類型密末。 什么是值類型與引用類型握爷?這要...
    franose閱讀 617評論 1 8
  • 無奈新啼,卻無可奈何,這大概是最高境界的無奈了吧刹碾。
    行走者閱讀 326評論 0 0