數組和對象的深拷貝、淺拷貝方法有所不同,以下是常見的實現方式:
?
一、淺拷貝方法(數組和對象通用/專用)
?
淺拷貝只復制表層數據,嵌套的引用類型仍共享內存。
?
1. 數組的淺拷貝
?
- 擴展運算符(...):?const arrCopy = [...originalArr];?
- Array.prototype.slice():?const arrCopy = originalArr.slice();?
- Array.prototype.concat():?const arrCopy = [].concat(originalArr);?
?
2. 對象的淺拷貝
?
- 擴展運算符(...):?const objCopy = {...originalObj};?
- Object.assign():?const objCopy = Object.assign({}, originalObj);?
?
二、深拷貝方法(數組和對象通用/專用)
?
深拷貝會復制所有嵌套數據,原數據和拷貝數據完全獨立。
?
1. 通用方法(數組和對象均可)
?
- JSON.parse(JSON.stringify()):
簡單易用,但有局限性(不支持函數、Symbol、循環引用等)。
示例:?const deepCopy = JSON.parse(JSON.stringify(original));?
- 遞歸實現:
自定義函數遍歷所有屬性,對引用類型遞歸拷貝,可處理復雜場景。
示例:
function deepClone(obj) {
? if (obj === null || typeof obj !== 'object') return obj;
? let copy = Array.isArray(obj) ? [] : {};
? for (let key in obj) {
? ? if (obj.hasOwnProperty(key)) {
? ? ? copy[key] = deepClone(obj[key]);
? ? }
? }
? return copy;
}
?
?
2. 其他工具方法
?
- Lodash庫的_.cloneDeep():
成熟可靠,支持各種數據類型(推薦實際開發使用)。
示例:?const deepCopy = _.cloneDeep(original);?
?
總結
?
- 淺拷貝適合無嵌套的簡單數據,實現簡單(擴展運算符、slice等)。
- 深拷貝適合有嵌套引用類型的數據,復雜場景推薦用 Lodash 的 ?_.cloneDeep?,簡單場景可臨時用 ?JSON.parse(JSON.stringify())?(注意其局限性)。