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