日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
在JavaScript中如何克隆對象?

當我們想要復(fù)制原始值和引用值(對象)時,它們的行為會大不相同。

公司主營業(yè)務(wù):成都網(wǎng)站制作、成都做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出廣安免費做網(wǎng)站回饋大家。

原始值

我們假設(shè)一個變量 name 具有一個與之關(guān)聯(lián)的原始值(number,string,boolean,undefined 和null)。如果我們將此變量 name 復(fù)制到另一個變量name2 ,則原始變量的任何修改都不會影響到第二個變量,因為它們是原始值。

 
 
 
 
  1. let name="前端小智"; 
  2. let name2= name; 
  3. console.log (name, name2); // 前端小智, 前端小智 
  4. name="王大冶"; 
  5. console.log (name,name2); // 王大冶 前端小智 

引用值

但是,如果我們對引用類型的值進行相同的操作,則我們對一個變量所做的任何更改也將反映在另一個變量中,因為兩個變量都指向同一對象。

數(shù)組

要拷貝數(shù)組,slice()方法用于創(chuàng)建數(shù)組的新副本??梢元毩⑿薷拇烁北?,而不會影響原始數(shù)組。

如果未傳遞任何參數(shù),則它會精確復(fù)制數(shù)組,但數(shù)字也可以作為參數(shù)傳遞。如果僅傳遞一個數(shù)字,它將確定我們要從其進行復(fù)制的索引的值,而如果傳遞兩個數(shù)字,則將標記開始和結(jié)束。

 
 
 
 
  1. // 示例1 
  2. const names = ['前端小智', '王大冶', '小力']; 
  3. const names2 = names; 
  4. console.log(names, names2); 
  5. // ["前端小智", "王大冶", "小力"]  
  6. // ["前端小智", "王大冶", "小力"]  
  7.  
  8. // 示例2 
  9. names2[2] = '前端小力'; 
  10. console.log(names, names2); 
  11. //  ["前端小智", "王大冶", "前端小力"]  
  12. //  ["前端小智", "王大冶", "前端小力"]  
  13.  
  14. // 示例3 
  15. const name2 = names.slice(); 
  16. names[2] = '我是隔壁老智'; 
  17. console.log(name2, names2) 
  18. // ["前端小智", "王大冶", "前端小力"] 
  19. //  ["前端小智", "王大冶", "我是隔壁老智"] 

對象

當引用值是一個對象時,也會發(fā)生同樣的情況,對其屬性之一的任何修改都會影響這兩個變量。若要克隆對象,請使用 Object.assign()方法,該方法會將一個或多個源對象的所有可枚舉屬性的值復(fù)制到目標對象,但是此方法僅對對象的一個淺拷貝。

 
 
 
 
  1. // 示例1 
  2. const names = { 
  3.   name: '前端小智', 
  4.   surname: '隔壁老智' 
  5.  
  6. const names2 = names; 
  7. console.log(names, names2) // 打印結(jié)果是一模一樣的 
  8.  
  9. // 示例2 
  10. names2.surname ='隔壁老王'; 
  11. console.log(names, names2) 
  12.  
  13. // {name: "前端小智", surname: "隔壁老王"} 
  14. // {name: "前端小智", surname: "隔壁老王"} 
  15.  
  16. // 示例3 
  17. const names3 = Object.assign({}, names); 
  18. names3.surname = '隔壁老色P'; 
  19. console.log(names, names3) 
  20.  
  21. // {name: "前端小智", surname: "隔壁老王"} 
  22. // {name: "前端小智", surname: "隔壁老色P"} 

要對對象進行深拷貝,需要使用其他方法。

正如我們所說,Object.assign()方法只是一個淺拷貝(即,當我們的對象沒有其他對象作為屬性時)才有效。在這些情況下,必須對對象進行深拷貝。

與淺拷貝不同,深拷貝以遞歸方式復(fù)制每個子對象,直到所有涉及的對象都被復(fù)制為止。

我們可以使用什么方法復(fù)制對象的深層副本?

JSON.parse(JSON.stringify(obj))

此方法使用JSON.stringify()將對象轉(zhuǎn)換為字符串,然后再用JSON.parse()將其轉(zhuǎn)換回對象。此方法對簡單對象有效,但如果對象屬性是函數(shù)時無效。

 
 
 
 
  1. const names = { 
  2.   name: '前端小智', 
  3.   surname: '隔壁老智', 
  4.   social: { 
  5.     wx: '大遷世界', 
  6.     url: 'www.lsp.com' 
  7.   } 
  8. const names2 = JSON.parse(JSON.stringify(names)); 
  9. names2.social.url = 'www.baidu.com'; 
  10. console.log(names, names2); 
  11.  
  12. /**  
  13.   name: "前端小智" 
  14.   social: {wx: "大遷世界", url: "www.lsp.com"} 
  15.   surname: "隔壁老智" 
  16. */ 
  17.  
  18. /**  
  19.   name: "前端小智" 
  20.   social: {wx: "大遷世界", url: "www.baidu.com"} 
  21.   surname: "隔壁老智" 
  22. */ 

深度拷貝

另一種非常有趣和優(yōu)雅的對象深度復(fù)制方法是使用遞歸函數(shù)。

我們創(chuàng)建了一個deepClone(object)函數(shù),將想要克隆的對象作為參數(shù)傳遞給它。在函數(shù)內(nèi)部,將創(chuàng)建一個局部變量克隆,這是一個空對象,其中將從起始對象克隆的每個屬性都將添加到該對象中。

具體思路:

  • 如果該屬性不是對象,則將其簡單地克隆并添加到新的克隆對象中。
  • 如果屬性是對象,則再次執(zhí)行deepClone(value)函數(shù),并將屬性的值(在這種情況下為對象)作為參數(shù)傳遞,并重復(fù)相同的過程。
 
 
 
 
  1. function deepClone(object) { 
  2.   var clone = {}; 
  3.   for (var key in object) { 
  4.     var value = object[key]; 
  5.     if (typeof(value) !== 'object') { 
  6.       clone[key] = value; 
  7.     } else { 
  8.       clone[key]=deepClone(value); 
  9.     } 
  10.   } 
  11.   return clone; 
  12. }  
  13.  
  14. deepClone({value1:1,value2:{value3:2}}); 
  15. //{value1:1,value2:{value3:2}} 
  16. deepClone({value1:1,value2:{value3:{value3b:3}}}); 
  17. //{value1:1,value2:{value3:{value3b:3}}} 

 作者:Luigi Nori 譯者:前端小智 來源:stackabuse

原文:https://www.ma-o.org/en/programming/javascript/the-javascript-asign-method-to-merge-and-clone-objects


網(wǎng)站題目:在JavaScript中如何克隆對象?
網(wǎng)頁網(wǎng)址:http://www.5511xx.com/article/dhjigij.html