淺拷貝是指,一個新的對象對原始對象的屬性值進行精確地拷貝,如果拷貝的是基本數據類型,拷貝的就是基本數據類型的值,如果是引用數據類型,拷貝的就是內存地址。如果其中一個對象的引用內存地址發生改變,另一個對象也會發生變化。
(1)Object.assign()Object.assign()是ES6中對象的拷貝方法,接受的第一個參數是目標對象,其余參數是源對象,用法:Object.assign(target, source_1, ···),該方法可以實現淺拷貝,也可以實現一維對象的深拷貝。注意:如果目標對象和源對象有同名屬性,或者多個源對象有同名屬性,則后面的屬性會覆蓋前面的屬性。
如果該函數只有一個參數,當參數為對象時,直接返回該對象;當參數不是對象時,會先將參數轉為對象然后返回。
因為null 和 undefined 不能轉化為對象,所以第一個參數不能為null或 undefined,會報錯。
(2)擴展運算符
使用擴展運算符可以在構造字面量對象的時候,進行屬性的拷貝。語法:let cloneObj = { ...obj };
(3)數組方法實現數組淺拷貝
1)Array.prototype.sliceslice()方法是JavaScript數組的一個方法,這個方法可以從已有數組中返回選定的元素:用法:array.slice(start, end),該方法不會改變原始數組。該方法有兩個參數,兩個參數都可選,如果兩個參數都不寫,就可以實現一個數組的淺拷貝。
2)Array.prototype.concatconcat() 方法用于合并兩個或多個數組。此方法不會更改現有數組,而是返回一個新數組該方法有兩個參數,兩個參數都可選,如果兩個參數都不寫,就可以實現一個數組的淺拷貝。