在使用JavaScript對數組進行操作的時候,我們經常需要將數組進行備份,也就是復制、克隆或者說做拷貝
要弄明白拷貝,首先要明白js中對象的組成。在js中一切實例皆是對象,具體分為原始類型和合成類型。原始類型對象指的是number、string、boolean等,合成類型對象指的是array、object以及function。 數組的拷貝有深有淺,下面具體分析!
2.知識剖析
淺拷貝
淺拷貝可以理解為就是復制一份來引用,所有引用對象都指向一份數據,并且都可以修改這份數據。 對于字符串類型,淺拷貝是對值的拷貝,對于對象來說,淺拷貝是對對象地址的拷貝,也就是復制 的結果是兩個對象指向同一個內存地址,修改其中一個對象的屬性,則另一個對象的屬性也會改變
var a = ['隔壁老王','冠希哥', '宋經理' //定義一個名為a的屬豬,里面有3個值,
];
var b = a;? //定義一個變量b,把a賦值給他,這樣比、b和a一樣了
b[2] = '沖沖老師'; //然后把b的第三個值等于沖沖老師
console.log(a)//那么現在打印a ['隔壁老王','冠希哥', '沖沖老師']
深拷貝
深拷貝則是復制變量值,對于非基本類型的變量,則遞歸至基本類型變量后,再復制。 深復制不同于淺復制,它會開辟新的內存地址,兩個對象對應兩個不同的地址,修改 一個對象的屬性,不會改變另一個對象的屬性
實現數組深拷貝有兩種方法!
方法一: 用js的slice函數來實現
方法二:用js的concat方法
3.常見問題
淺拷貝的缺點是如果你改變了對象B所指向的內存地址,你同時也改變了對象A指向這個地址的字段。
深拷貝,這種方式會完全拷貝所有數據,優點是B與A不會相互依賴(A,B完全脫離關聯), 缺點是拷貝的速度更慢,代價更大 (可理解為耗費了更多內存空間)