在 JavaScript 中實現深拷貝(Deep Copy)可以使用以下幾種方法:
手動遞歸復制:
使用遞歸的方式遍歷對象或數組,對每個屬性進行復制操作。當遇到對象或數組時,再遞歸調用深拷貝函數。這種方法可以處理多層嵌套的數據結構,但要注意避免循環引用。
function deepCopy(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let copy;
if (obj instanceof Array) {
copy = [];
for (let i = 0; i < obj.length; i++) {
copy[i] = deepCopy(obj[i]);
}
} else {
copy = {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
copy[key] = deepCopy(obj[key]);
}
}
}
return copy;
}
// 使用示例
const originalObj = { name: 'John', age: 25, hobbies: ['reading', 'running'] };
const copiedObj = deepCopy(originalObj);
使用 JSON 序列化和反序列化:
將對象轉換為 JSON 字符串,然后再將 JSON 字符串轉換回對象。這種方法簡單易用,但可能會有一些限制,例如無法復制特定類型的對象或函數。
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj));
}
// 使用示例
const originalObj = { name: 'John', age: 25, hobbies: ['reading', 'running'] };
const copiedObj = deepCopy(originalObj);
需要注意的是,使用 JSON 序列化和反序列化的方法會丟失一些特殊的對象屬性或方法,如函數、正則表達式、日期對象等。在選擇深拷貝方法時,根據具體的需求和數據類型進行選擇。