成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在 JavaScript 中如何克隆對(duì)象?

開發(fā) 前端
我們假設(shè)一個(gè)變量 name 具有一個(gè)與之關(guān)聯(lián)的原始值(number,string,boolean,undefined 和null)。如果我們將此變量 name 復(fù)制到另一個(gè)變量name2 ,則原始變量的任何修改都不會(huì)影響到第二個(gè)變量,因?yàn)樗鼈兪窃贾怠?/div>

[[403451]]

當(dāng)我們想要復(fù)制原始值和引用值(對(duì)象)時(shí),它們的行為會(huì)大不相同。

原始值

我們假設(shè)一個(gè)變量 name 具有一個(gè)與之關(guān)聯(lián)的原始值(number,string,boolean,undefined 和null)。如果我們將此變量 name 復(fù)制到另一個(gè)變量name2 ,則原始變量的任何修改都不會(huì)影響到第二個(gè)變量,因?yàn)樗鼈兪窃贾怠?/p>

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

引用值

但是,如果我們對(duì)引用類型的值進(jìn)行相同的操作,則我們對(duì)一個(gè)變量所做的任何更改也將反映在另一個(gè)變量中,因?yàn)閮蓚€(gè)變量都指向同一對(duì)象。

數(shù)組

要拷貝數(shù)組,slice()方法用于創(chuàng)建數(shù)組的新副本。可以獨(dú)立修改此副本,而不會(huì)影響原始數(shù)組。

如果未傳遞任何參數(shù),則它會(huì)精確復(fù)制數(shù)組,但數(shù)字也可以作為參數(shù)傳遞。如果僅傳遞一個(gè)數(shù)字,它將確定我們要從其進(jìn)行復(fù)制的索引的值,而如果傳遞兩個(gè)數(shù)字,則將標(biāo)記開始和結(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. //  ["前端小智""王大冶""我是隔壁老智"

對(duì)象

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

  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"

要對(duì)對(duì)象進(jìn)行深拷貝,需要使用其他方法。

正如我們所說(shuō),Object.assign()方法只是一個(gè)淺拷貝(即,當(dāng)我們的對(duì)象沒有其他對(duì)象作為屬性時(shí))才有效。在這些情況下,必須對(duì)對(duì)象進(jìn)行深拷貝。

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

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

JSON.parse(JSON.stringify(obj))

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

  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)雅的對(duì)象深度復(fù)制方法是使用遞歸函數(shù)。

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

具體思路:

  • 如果該屬性不是對(duì)象,則將其簡(jiǎn)單地克隆并添加到新的克隆對(duì)象中。
  • 如果屬性是對(duì)象,則再次執(zhí)行deepClone(value)函數(shù),并將屬性的值(在這種情況下為對(duì)象)作為參數(shù)傳遞,并重復(fù)相同的過(guò)程。
  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 譯者:前端小智 來(lái)源:stackabuse

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

 

責(zé)任編輯:姜華 來(lái)源: 大遷世界
相關(guān)推薦

2021-03-18 10:45:02

JavaScript數(shù)組運(yùn)算符

2020-08-19 08:29:22

JavaScript 對(duì)象函數(shù)

2024-01-05 07:46:15

JS克隆對(duì)象JSON

2020-08-23 11:32:21

JavaScript開發(fā)技術(shù)

2021-03-26 23:41:19

JavaScript對(duì)象開發(fā)

2023-11-21 15:23:15

JavaScript工具

2010-09-08 16:50:11

JavaScriptDOM操作

2025-01-09 09:14:44

2023-06-02 15:42:51

JavaScript數(shù)據(jù)結(jié)構(gòu)對(duì)象

2018-12-19 19:30:46

JavaScript創(chuàng)建對(duì)象前端

2015-07-06 09:59:56

JavaScript私有成員

2024-04-11 08:30:05

JavaScript數(shù)組函數(shù)

2020-11-26 08:12:24

JavaScript對(duì)象數(shù)組

2021-10-21 18:47:37

JavaScript面向對(duì)象

2009-06-24 15:28:19

arguments對(duì)象JavaScript函

2024-01-29 00:57:20

GuavaJava拷貝

2023-04-26 15:19:36

JavaScripMap數(shù)組

2018-04-03 13:10:27

Java對(duì)象克隆

2016-08-03 17:23:47

javascripthtml前端

2023-01-18 10:41:43

JavaScrip獲取網(wǎng)絡(luò)數(shù)據(jù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产日韩欧美在线观看 | 亚洲 欧美 激情 另类 校园 | 另类在线| 精品视频在线观看 | 日韩网 | 中文字幕一级毛片视频 | 久久一二| 国产精品 亚洲一区 | 国产1区2区在线观看 | 一级黄a视频| 尤物在线视频 | 亚洲国产精品99久久久久久久久 | 欧美日韩久久精品 | 中文字幕日韩欧美一区二区三区 | 中国一级特黄毛片大片 | 国产精品国产三级国产aⅴ无密码 | 九九综合 | 亚洲精品久久久9婷婷中文字幕 | av一区二区在线观看 | 日韩精品成人网 | 久久最新精品视频 | 日韩av在线免费 | 五月婷亚洲 | 欧美99| 久草精品视频 | 中文字幕一区二区三区四区五区 | 精品久久久久久亚洲精品 | 国产精品99久久久久久www | 欧美www在线| 国产一区精品 | 欧美福利 | 黄色毛片免费 | 中文字幕视频在线观看 | 国产成人av电影 | 国产成人精品视频在线观看 | 一级在线视频 | 免费在线看黄视频 | 亚洲一区三区在线观看 | 亚洲精品视频免费观看 | 99精品免费久久久久久日本 | 亚洲最大av网站 |