concat和slice都是對數(shù)組的拷貝吊输,具體是怎么進行拷貝的我們在這里不進行詳細的說明了青自,如果不知道大家可以自己去理解攘轩,今天是關(guān)于我對這兩個數(shù)組是深拷貝還是淺拷貝進行分析:
一.深拷貝和淺拷貝
如何對深拷貝和淺拷貝進行區(qū)分呢淋叶,舉個簡單的栗子,假設(shè)A復制了B雕拼,將B的值進行修改纵东,看A的值的變化,如果A的值發(fā)生了改變悲没,說明是淺拷貝篮迎,如果A的值沒有變化就是深拷貝,淺拷貝就是拷貝了內(nèi)存示姿,當改變了一個指針指向的值時甜橱,另外的也發(fā)生了變化,而深拷貝是開辟了一個獨立的內(nèi)存栈戳,指針指向的值變化是岂傲,另一個內(nèi)存中的值沒有變化。
看到這個例子后我就覺得這個concat不是深拷貝嘛子檀,怎么變成了淺拷貝镊掖,然而大家可能忽略了一點,深拷貝和淺拷貝處理的是引用數(shù)據(jù)類型褂痰,而不是這個基本數(shù)據(jù)類型亩进。
二.基本數(shù)據(jù)類型和引用數(shù)據(jù)類型
基本數(shù)據(jù)類型:名值存儲在棧內(nèi)存中;
引用數(shù)據(jù)類型:名存在棧內(nèi)存中缩歪,值存在于堆內(nèi)存中归薛,但是棧內(nèi)存會提供一個引用的地址指向堆內(nèi)存中的值。
像這樣匪蝙,concat過后主籍,處理的是a數(shù)據(jù)的第一項也是個數(shù)組,是引用數(shù)據(jù)類型逛球,所以最終b數(shù)組也發(fā)生了變化千元,自此,其實concat是淺拷貝颤绕,并不是深拷貝幸海。但是又有一個問題,請看下個例子:
上面也是對引用數(shù)據(jù)類型的處理奥务,為什么還是不變呢涕烧?
原因就是我將a[0]存儲的指針變了,而b[0]的指針沒有變汗洒,這是直接替換了指針,并不是通過指針修改數(shù)據(jù)父款。簡單的說引用數(shù)據(jù)類型的地址和值不存在一起溢谤,而是通過指針從地址指向值瞻凤,a[0]變化了,就是指針的指向變了世杀。