js對象陌宿、數(shù)組拷貝

????????在js中锡足,數(shù)據(jù)類型類型可分為值類型(基本類型)和引用類型。值類型有:字符串(String)壳坪、布爾(Boolean)舶得、數(shù)字(Number)、對空(Null)爽蝴、未定義(undefined)沐批、Symbol纫骑。引用類型:對象(Object)、數(shù)組(Array)九孩、函數(shù)(Function)先馆。這兩種類型的不同,使得在拷貝的時候也會有差異躺彬。值類型拷貝的時候直接賦值就好煤墙,但是在引用類型的對象和數(shù)組中,如果直接整體賦值的話有的時候是會有問題的顾患。在項目中番捂,我們經(jīng)常需要保存一份原始數(shù)據(jù),然后拷貝一份原始數(shù)據(jù)進行更改江解,那么如果這個數(shù)據(jù)是Object或者Array類型设预,我們直接拷貝的話,他們還是指向的同一個地址犁河,所以鳖枕,當我們改變其中的一個值或者新增一個屬性時,另一份也會跟著變化桨螺,這肯定不是我們想要的結(jié)果宾符,那么今天就總結(jié)一下js中,對象灭翔、數(shù)組拷貝的問題魏烫。

????????拷貝的問題也是分為兩種,一種是淺拷貝肝箱、另一種是深拷貝哄褒。在總結(jié)之前,我們先定義一個較復(fù)雜的對象名為Obj,后面的代碼都是使用該對象進行更改的煌张,具體結(jié)構(gòu)如下:

let Obj = {

????name:'zhang',

????age:18,

????score:{

????????Chinese:98,

????????English:88,

????????Math:98

????},

????like:[{

????????????sports:5

? ? ? ? ? },

????????{

????????????sports:4

????????},{

????????????sports:3

????????}]

}

一呐赡、淺拷貝

1、淺拷貝之使用Object.assign方式

function ObjCopy1(){

????let Obj1 = Object.assign({},Obj,);

????Obj1.name = 'zhang1';

????Obj1.like[1].sports = 55;

????Obj1.score.Chinese = 100,

????console.log('Obj.name:',Obj.name,' Obj.like[1].sports:',Obj.like[1].sports,'? ????Obj.score.Chinese:',Obj.score.Chinese);

????console.log('Obj1.name:',Obj1.name,'? Obj1.like[1].sports',Obj1.like[1].sports,'? ????Obj1.score.Chinese:',Obj1.score.Chinese);

}

ObjCopy1();


Object.assign淺拷貝結(jié)果

2骏融、淺拷貝之...運算符實現(xiàn)

function ObjCopy2(){

????let Obj2 = {...Obj};

????Obj2.name = 'zhang1';

????Obj2.like[1].sports = 55;

????Obj2.score.Chinese = 100,

????console.log('Obj.name:',Obj.name,'? Obj.like[1].sports:',Obj.like[1].sports,'? ????Obj.score.Chinese:',Obj.score.Chinese);

????console.log('Obj2.name:',Obj2.name,'? Obj2.like[1].sports',Obj2.like[1].sports,'? ????Obj2.score.Chinese:',Obj2.score.Chinese);

}

ObjCopy2();


...運算符淺拷貝結(jié)果

3链嘀、淺拷貝之一重循環(huán)直接遍歷

function ObjCopy3(Obj){

????let Obj3={};

????for (let item in Obj){

????????Obj3[item] = Obj[item]

????}

????Obj3.name = 'zhang1';

????Obj3.like[1].sports = 55;

? ? Obj3.score.Chinese = 100,

????console.log('Obj.name:',Obj.name,'? Obj.like[1].sports:',Obj.like[1].sports,'? ????Obj.score.Chinese:',Obj.score.Chinese);

????console.log('Obj3.name:',Obj3.name,'? Obj3.like[1].sports',Obj3.like[1].sports,'? ????Obj3.score.Chinese:',Obj3.score.Chinese);

}

一重循環(huán)遍歷淺拷貝結(jié)果

????????通過結(jié)果可以看到,通過以上三種方式實現(xiàn)的拷貝都是淺拷貝档玻,當嵌套多層Object或Array時怀泊,我們更改value中的對象或Array的值時,原始數(shù)據(jù)也跟著變化了窃肠。

二包个、深拷貝

1、深度拷貝之使用JSON.parse()和JSON.stringify()

function ObjCopy4(){

????let Obj4 = JSON.parse(JSON.stringify(Obj));

????Obj4.name = 'zhang1';

????Obj4.like[1].sports = 55;

????Obj4.score.Chinese = 100,

????console.log('Obj.name:',Obj.name,'? Obj.like[1].sports:',Obj.like[1].sports,'? ????Obj.score.Chinese:',Obj.score.Chinese);

????console.log('Obj4.name:',Obj4.name,'? Obj4.like[1].sports',Obj4.like[1].sports,'? ????Obj4.score.Chinese:',Obj4.score.Chinese);

}

ObjCopy4();

利用JSON.parse()和JSON.stringify()? 方法拷貝結(jié)果

2碧囊、利用遞歸树灶,自定義深度拷貝

function ObjCopy5(){

function copy (Obj) {

? ? ? ? var newObj = Obj.constructor === Array ? [] : {};

? ? ? ? if(typeof Obj !== 'object'){

? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? for(var i in Obj){

? ? ? ? ? newObj[i] = typeof Obj[i] === 'object' ?

? ? ? ? ? copy(Obj[i]) : Obj[i];

? ? ? ? }

? ? ? ? return newObj

}

var Obj5 = copy(Obj)

Obj5.name = 'zhang1';

Obj5.like[1].sports = 55;

Obj5.score.Chinese = 100,

console.log('Obj.name:',Obj.name,'? Obj.like[1].sports:',Obj.like[1].sports,'? Obj.score.Chinese:',Obj.score.Chinese);

console.log('Obj5.name:',Obj5.name,'? Obj5.like[1].sports',Obj5.like[1].sports,'? Obj5.score.Chinese:',Obj5.score.Chinese);

}

遞歸方法實現(xiàn)深度拷貝

????????這兩種方法都能實現(xiàn)深度拷貝,此處只是針對Object和Array糯而,F(xiàn)unction的不一定能夠拷貝成功天通。一般情況下針對只含有Object和Array的對象拷貝時,使用JSON.parse()和JSON.stringify()方法拷貝是非常簡單的熄驼。此處我只總結(jié)了5種方法像寒,如果有其它的方法,也希望大家能夠多分享哦瓜贾。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诺祸,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子祭芦,更是在濱河造成了極大的恐慌筷笨,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件龟劲,死亡現(xiàn)場離奇詭異胃夏,居然都是意外死亡,警方通過查閱死者的電腦和手機昌跌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門仰禀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蚕愤,你說我怎么就攤上這事答恶。” “怎么了萍诱?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵亥宿,是天一觀的道長。 經(jīng)常有香客問我砂沛,道長,這世上最難降的妖魔是什么曙求? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任碍庵,我火速辦了婚禮,結(jié)果婚禮上悟狱,老公的妹妹穿的比我還像新娘静浴。我一直安慰自己,他們只是感情好挤渐,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布苹享。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪得问。 梳的紋絲不亂的頭發(fā)上囤攀,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機與錄音宫纬,去河邊找鬼焚挠。 笑死,一個胖子當著我的面吹牛漓骚,可吹牛的內(nèi)容都是我干的蝌衔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蝌蹂,長吁一口氣:“原來是場噩夢啊……” “哼噩斟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起孤个,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剃允,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后硼身,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體硅急,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年佳遂,在試婚紗的時候發(fā)現(xiàn)自己被綠了营袜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡丑罪,死狀恐怖荚板,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情吩屹,我是刑警寧澤跪另,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站煤搜,受9級特大地震影響免绿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜擦盾,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一嘲驾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迹卢,春花似錦辽故、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春喂走,著一層夾襖步出監(jiān)牢的瞬間殃饿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工缴啡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留壁晒,地道東北人。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓业栅,卻偏偏與公主長得像秒咐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碘裕,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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

  • JavaScript(面向?qū)ο?原型理解+繼承+作用域鏈和閉包+this使用總結(jié)) 一携取、面向?qū)ο?1、什么是面向?qū)?..
    老頭子_d0ec閱讀 302評論 0 0
  • 關(guān)于JavaScript的淺拷貝和深拷貝 在JS中有一些基本類型像是Number帮孔、String雷滋、Boolean,而...
    成都reactnative閱讀 311評論 0 0
  • 小編已經(jīng)更新了代碼部分文兢,戳這里 一晤斩、數(shù)據(jù)類型 數(shù)據(jù)分為基本數(shù)據(jù)類型(String, Number, Boolean...
    grain先森閱讀 2,750評論 2 53
  • 1.引用類型有哪些?非引用類型有哪些 引用類型: 對象 object 數(shù)組 函數(shù) 正則非引用類型...
    怎么昵稱閱讀 247評論 0 0
  • 引用類型有哪些姆坚?非引用類型有哪些澳泵? JS中的數(shù)據(jù)類型分為基本類型和引用類型〖婧牵基本類型:數(shù)值(number)兔辅、字符串...
    LeeoZz閱讀 269評論 0 0