如何深淺拷貝數(shù)組(總結(jié))

這兩天遇到了一個(gè)問題盆繁,如何復(fù)制數(shù)組细诸,所以就從各個(gè)地方找了很多的解決辦法倒庵。算是整理一下绿贞,這樣以便于自己以后的學(xué)習(xí):

【TOC】目錄

  • 淺拷貝數(shù)組
  • 深拷貝數(shù)組
    • 1.使用數(shù)組遍歷賦值
      • 原理
      • 代碼實(shí)現(xiàn)
    • 2.返回新數(shù)組方法
      • 2.1 使用slice方法
        • 原理
        • 代碼實(shí)現(xiàn)
      • 2.2 使用數(shù)組map方法
      • 2.3 使用concat方法
    • 3.ES6語法實(shí)現(xiàn)深拷貝
    • 4.for-in連原型鏈也一并復(fù)制的方法
    • 5.多維數(shù)組的復(fù)制

淺拷貝數(shù)組

首先第一個(gè)復(fù)制數(shù)組我們都想到的是定義一個(gè)數(shù)組直接相等就可以了:

  var arr1 = [1,2,3];
  var arr2 = arr1;
  arr1[0] = 2;
  console.log(arr1[0]);  //2

出現(xiàn)這個(gè)的原因就是因?yàn)橐蚩椋瑪?shù)組是用堆去保存的,所以這個(gè)算是淺拷貝籍铁,相等的時(shí)候只是把存放的地址拷貝過去了涡上,兩個(gè)指向了同一個(gè)地址,所以在改變其中一個(gè)的值拒名,其他的也跟著改變了吩愧。
所以如何深拷貝一個(gè)數(shù)組呢?

深拷貝數(shù)組

1.使用數(shù)組遍歷賦值

原理

這個(gè)是最原始的辦法增显,就是把每個(gè)值取出來到另一個(gè)數(shù)組中雁佳。

代碼實(shí)現(xiàn)

  var arr1 = [1,2,3];
  var arr2 = [];
  arr1.forEach(function(value,index){
    arr2[index] = value;
  }) 
  console.log(arr2);
//這個(gè)時(shí)候改變arr1[0]  = 3;那么輸出arr2[0]還是等于1

2. 返回新數(shù)組方法

2.1 使用slice方法

原理

數(shù)組的slice方法是截取數(shù)組的意思,在之前的數(shù)組總結(jié)中也有提過同云。
slice(0)指的是從0開始到末尾截取數(shù)組甘穿,然后返回一個(gè)新的數(shù)組,這樣就不會(huì)影響到原來的數(shù)組了梢杭。

代碼實(shí)現(xiàn)
  var arr1 = [1,2,3];
  var arr2 = arr1.slice(0);
  console.log(arr2); //[1,2,3]
//這個(gè)時(shí)候改變arr1[2] = 5,那么輸出arr2[2]還是等于3

順著這種方法是不是得到了思維的開闊,來看看還有哪些是返回新數(shù)組的秸滴?

2.2使用數(shù)組map方法

使用map方法遍歷數(shù)組然后返回新的數(shù)組武契,里面的值不變

  var arr1 = [2,3,4];
  var arr2 = arr1.map(function(value){
    return value;  
  })
  console.log(arr2);  //[2,3,4]

2.3使用concat方法

連接數(shù)組,如果連接的是一個(gè)空荡含,那么也是返回了新的本身的數(shù)組

  var arr1 = [3,4,5];
  var arr2 = arr1.concat();
  console.log(arr2);   //[3,4,5]

3.ES6語法實(shí)現(xiàn)深拷貝

ES6擴(kuò)展運(yùn)算符實(shí)現(xiàn)數(shù)組的深拷貝咒唆,目前是最簡(jiǎn)單的。

  var arr = [1,2,3,4,5];
  var [ ... arr2 ] = arr;
  console.log(arr); //[1,2,3,4,5]
  console.log(arr2); //[1,2,3,4,5]

4.for-in連原型鏈也一并復(fù)制的方法

這種辦法释液,不僅復(fù)制的值全释,還會(huì)把屬性也進(jìn)行拷貝。

var arr = [1,2,3,4,5];
arr.prototype = 5;
var arr2 = [];
for(var a in arr){
  arr2[a] = arr[a];
}
console.log(arr2); // [1,2,3,4,5]
console.log(arr2.prototype); // 5
//之前的方法中新數(shù)組的prototype都是undefined

5.多維數(shù)組的復(fù)制

原理

多維數(shù)組轉(zhuǎn)化為字符串會(huì)成為一維數(shù)組误债。

  var arr = [[1,2],3,4,[5,6]];
  var arr1 = arr.toString().split(",")
  var arr2 = arr.join().split(",")
  console.log(arr1) //[1,2,3,4,5,6]
  console.log(arr2) //[1,2,3,4,5,6]

但是怎么可以保持那種二維數(shù)組的狀態(tài)呢浸船?需要下面的代碼

代碼實(shí)現(xiàn)

  var arr = [[1,2],3,4,[5,6]];
  var arr3 = JSON.parse(JSON.stringify(arr));  
  console.log(arr3) // [[1,2],3,4,[5,6]]

如果你有新的方法歡迎留言?如果我找到新的方法會(huì)不定期更新...

?burning_韻七七

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寝蹈,一起剝皮案震驚了整個(gè)濱河市李命,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌箫老,老刑警劉巖封字,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡阔籽,警方通過查閱死者的電腦和手機(jī)流妻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笆制,“玉大人绅这,你說我怎么就攤上這事∠詈兀” “怎么了君躺?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)开缎。 經(jīng)常有香客問我棕叫,道長(zhǎng),這世上最難降的妖魔是什么奕删? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任俺泣,我火速辦了婚禮,結(jié)果婚禮上完残,老公的妹妹穿的比我還像新娘伏钠。我一直安慰自己,他們只是感情好谨设,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布熟掂。 她就那樣靜靜地躺著,像睡著了一般扎拣。 火紅的嫁衣襯著肌膚如雪赴肚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼捧挺。 笑死堰怨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼商玫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牡借,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤决帖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蓖捶,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體地回,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了刻像。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畅买。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖细睡,靈堂內(nèi)的尸體忽然破棺而出谷羞,到底是詐尸還是另有隱情,我是刑警寧澤溜徙,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布湃缎,位于F島的核電站,受9級(jí)特大地震影響蠢壹,放射性物質(zhì)發(fā)生泄漏嗓违。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一图贸、第九天 我趴在偏房一處隱蔽的房頂上張望蹂季。 院中可真熱鬧,春花似錦疏日、人聲如沸偿洁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽涕滋。三九已至,卻和暖如春挠阁,著一層夾襖步出監(jiān)牢的瞬間何吝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工鹃唯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓣喊。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓坡慌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親藻三。 傳聞我的和親對(duì)象是個(gè)殘疾皇子洪橘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,151評(píng)論 0 13
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,288評(píng)論 25 707
  • 下雨了 月亮不來 我也不用等 喝著酒 在沒有月亮的街 沒有就沒有 又不是永別了 沒有,倒也好 反正 人也沒齊
    世紀(jì)世紀(jì)閱讀 329評(píng)論 0 11