js拷貝

## 14 個(gè)拷貝數(shù)組的 JS 技巧

[100素材網(wǎng)](javascript:void(0);) *今天*

以下文章來(lái)源于大遷世界 ,作者前端小智

 [![大遷世界](https://upload-images.jianshu.io/upload_images/9195867-abc228ac9568dd32?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 

**大遷世界**

我要先堅(jiān)持分享20年棍厌,大家來(lái)一起見(jiàn)證吧甸昏。](https://mp.weixin.qq.com/s?__biz=MzIwMDYyOTE1NA==&mid=2650235209&idx=1&sn=15b50e7be88f519894e5de6b84193bc0&chksm=8ef98f84b98e06921ab76a14e247ce2de5b58e5ecf7747816027840da91e0b38e7d80cfeba51&scene=0&xtrack=1&key=d6a080855538065e07da9c82810d3c8d3e6df0670621cf04fbfa937a23c71a8d17487cc1d56299da9cbdad48c5d967a62caaa9c8226ca999c865209984ad6ed37e88a39b966aee8fdba8b13ad751e479&ascene=1&uin=MjI2MDA3ODQyMw%3D%3D&devicetype=Windows+7&version=62060834&lang=zh_CN&pass_ticket=csPtwbpfBJsy5STsuFnc%2FYJNBhJY53roQGyuZ3k1GqhrFnaRV1nYVGlJZHH8sC3Y&winzoom=1#) 

**為了保證的可讀性膀懈,本文采用意譯而非直譯。**

數(shù)組拷貝經(jīng)常被誤解漓踢,但這并不是因?yàn)榭截愡^(guò)程本身,而是因?yàn)槿狈?duì) JS 如何處理數(shù)組及其元素的理解。JS 中的數(shù)組是可變的午乓,這說(shuō)明在創(chuàng)建數(shù)組之后還可以修改數(shù)組的內(nèi)容。

這意味著要拷貝一個(gè)數(shù)組闸准,咱們不能簡(jiǎn)單地將舊數(shù)組分配給一個(gè)新變量益愈,它也是一個(gè)數(shù)組。如果這樣做,它們將共享相同的引用蒸其,并且在更改一個(gè)變量之后敏释,另一個(gè)變量也將受到更改的影響。這就是我們需要克隆這個(gè)數(shù)組的原因摸袁。

接著來(lái)看看一些關(guān)于拷貝和克隆數(shù)組的有趣方法和技巧钥顽。

### 技巧 1 - 使用`Array.slice`方法

const numbers = [1, 2, 3, 4, 5]const copy = numbers.slice()copy.push(6) // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy)console.log(numbers)// 輸出// [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


### 技巧 2 - 使用`Array.map`方法

const numbers = [1, 2, 3, 4, 5]const copy = numbers.map( num => num )copy.push(6) // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出// [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


### 技巧 3 - 使用`Array.from `方法

const numbers = [1, 2, 3, 4, 5];const copy = Array.from(new Set(numbers));copy.push(6); // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出// [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


### 技巧 4 - 使用展開(kāi)操作符

const numbers = [1, 2, 3, 4, 5];const copy = [...numbers];copy.push(6); // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出 // [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


### 技巧 5 - 使用 `Array.of` 方法和展開(kāi)操作符

const numbers = [1, 2, 3, 4, 5];const copy = Array.of(...numbers);copy.push(6); // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出 // [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


`Array.of()` 方法創(chuàng)建一個(gè)具有可變數(shù)量參數(shù)的新數(shù)組實(shí)例,而不考慮參數(shù)的數(shù)量或類(lèi)型靠汁。`Array.of()` 和 `Array` 構(gòu)造函數(shù)之間的區(qū)別在于處理整數(shù)參數(shù):`Array.of(7`) 創(chuàng)建一個(gè)具有**單個(gè)元素 7 的數(shù)組**蜂大,而 `Array(7)` 創(chuàng)建一個(gè)長(zhǎng)度為`7`的空數(shù)組(注意:這是指一個(gè)有`7個(gè)`空位(empty)的數(shù)組,而不是由`7`個(gè)`undefined`組成的數(shù)組)蝶怔。

Array.of(7); // [7] Array.of(1, 2, 3); // [1, 2, 3]Array(7); // [ , , , , , , ]Array(1, 2, 3); // [1, 2, 3]


### 技巧 6 - 使用 Array 構(gòu)造函數(shù)和展開(kāi)操作符

const numbers = [1, 2, 3, 4, 5];const copy = new Array(...numbers);copy.push(6); // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出 // [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


### 技巧 7 - 使用解構(gòu)

const numbers = [1, 2, 3, 4, 5];const [...copy] = numbers;copy.push(6); // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出// [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


### 技巧 8 - 使用 Array.concat 方法

const numbers = [1, 2, 3, 4, 5];const copy = numbers.concat();copy.push(6); // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出// [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


### 技巧 9 - 使用 `Array.push` 方法和展開(kāi)操作符

const numbers = [1, 2, 3, 4, 5];let copy = [];copy.push(...numbers);copy.push(6); // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出// [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


### 技巧 10 - 使用 `Array.unshift ` 方法和展開(kāi)操作符

const numbers = [1, 2, 3, 4, 5];let copy = [];copy.unshift(...numbers);copy.push(6); // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出// [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


### 技巧 11 - 使用 `Array.forEach` 方法和展開(kāi)操作符

const numbers = [1, 2, 3, 4, 5];let copy = [];numbers.forEach((value) => copy.push(value));copy.push(6); // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出// [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


### 技巧 12 - 使用 `for` 循環(huán)

const numbers = [1, 2, 3, 4, 5];let copy = [];for (let i = 0; i < numbers.length; i++) { copy.push(numbers[i]);}copy.push(6); // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出// [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


### 技巧 13 - 使用 `Array.reduce` 方法

> 這個(gè)做法是可行奶浦,但比較多余,少用

const numbers = [1, 2, 3, 4, 5];const copy = numbers.reduce((acc, x) => { acc.push(x); return acc; }, []);copy.push(6); // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出// [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


### 技巧 14 - 使用古老的 `apply` 方法

const numbers = [1, 2, 3, 4, 5];

let copy = [];Array.prototype.push.apply(copy, numbers);copy.push(6); // 添加新項(xiàng)以證明不會(huì)修改原始數(shù)組console.log(copy);console.log(numbers);// 輸出// [1, 2, 3, 4, 5, 6]// [1, 2, 3, 4, 5]


**代碼部署后可能存在的BUG沒(méi)法實(shí)時(shí)知道添谊,事后為了解決這些BUG财喳,花了大量的時(shí)間進(jìn)行l(wèi)og 調(diào)試,這邊順便給大家推薦一個(gè)好用的BUG監(jiān)控工具 Fundebug斩狱。**

原文:https://twitter.com/protic_milos

### 總結(jié)

**請(qǐng)注意**耳高,上面這些方法執(zhí)行的是淺拷貝,就是數(shù)組是元素是對(duì)象的時(shí)候所踊,咱們更改對(duì)象的值泌枪,另一個(gè)也會(huì)跟著變,就能**技巧4**來(lái)說(shuō)秕岛,如果咱們的數(shù)組元素是對(duì)象碌燕,如下所示:

const authors = [ { name: '前端小智', age: 25 }, { name: '王大冶', age: 30 }, ]const copy = [...authors ]copy[0].name = '被更改過(guò)的前端小智'console.log(copy)console.log(authors)


輸出

![image.gif](https://upload-images.jianshu.io/upload_images/9195867-1d02c2383e95d696.gif?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 

![image.gif](https://upload-images.jianshu.io/upload_images/9195867-bcaeaadc78b5a27d.gif?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

[閱讀原文](https://mp.weixin.qq.com/s?__biz=MzIwMDYyOTE1NA==&mid=2650235209&idx=1&sn=15b50e7be88f519894e5de6b84193bc0&chksm=8ef98f84b98e06921ab76a14e247ce2de5b58e5ecf7747816027840da91e0b38e7d80cfeba51&scene=0&xtrack=1&key=d6a080855538065e07da9c82810d3c8d3e6df0670621cf04fbfa937a23c71a8d17487cc1d56299da9cbdad48c5d967a62caaa9c8226ca999c865209984ad6ed37e88a39b966aee8fdba8b13ad751e479&ascene=1&uin=MjI2MDA3ODQyMw%3D%3D&devicetype=Windows+7&version=62060834&lang=zh_CN&pass_ticket=csPtwbpfBJsy5STsuFnc%2FYJNBhJY53roQGyuZ3k1GqhrFnaRV1nYVGlJZHH8sC3Y&winzoom=1##)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市继薛,隨后出現(xiàn)的幾起案子修壕,更是在濱河造成了極大的恐慌,老刑警劉巖遏考,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件慈鸠,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡灌具,警方通過(guò)查閱死者的電腦和手機(jī)青团,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咖楣,“玉大人督笆,你說(shuō)我怎么就攤上這事∮栈撸” “怎么了娃肿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我料扰,道長(zhǎng)锨阿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任记罚,我火速辦了婚禮墅诡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘桐智。我一直安慰自己末早,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布说庭。 她就那樣靜靜地躺著然磷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪刊驴。 梳的紋絲不亂的頭發(fā)上姿搜,一...
    開(kāi)封第一講書(shū)人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音捆憎,去河邊找鬼舅柜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛躲惰,可吹牛的內(nèi)容都是我干的致份。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼础拨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼氮块!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起诡宗,我...
    開(kāi)封第一講書(shū)人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滔蝉,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后塔沃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蝠引,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年芳悲,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了立肘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片边坤。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡名扛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茧痒,到底是詐尸還是另有隱情肮韧,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站弄企,受9級(jí)特大地震影響超燃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拘领,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一意乓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧约素,春花似錦届良、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至送悔,卻和暖如春慢显,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欠啤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工荚藻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洁段。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓鞋喇,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親眉撵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侦香,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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