在 JavaScript 中實現(xiàn)深拷貝(Deep Copy)可以使用以下幾種方法:
手動遞歸復(fù)制:
使用遞歸的方式遍歷對象或數(shù)組,對每個屬性進(jìn)行復(fù)制操作。當(dāng)遇到對象或數(shù)組時,再遞歸調(diào)用深拷貝函數(shù)。這種方法可以處理多層嵌套的數(shù)據(jù)結(jié)構(gòu),但要注意避免循環(huán)引用。
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 序列化和反序列化:
將對象轉(zhuǎn)換為 JSON 字符串,然后再將 JSON 字符串轉(zhuǎn)換回對象。這種方法簡單易用,但可能會有一些限制,例如無法復(fù)制特定類型的對象或函數(shù)。
function deepCopy(obj) {
return JSON.parse(JSON.stringify(obj));
}
// 使用示例
const originalObj = { name: 'John', age: 25, hobbies: ['reading', 'running'] };
const copiedObj = deepCopy(originalObj);
需要注意的是,使用 JSON 序列化和反序列化的方法會丟失一些特殊的對象屬性或方法,如函數(shù)、正則表達(dá)式、日期對象等。在選擇深拷貝方法時,根據(jù)具體的需求和數(shù)據(jù)類型進(jìn)行選擇。