//写一个深拷贝
- 递归
- 循环
- 递归 + 循环
- JSON.parse(JSON.stringify(obj))
- 递归
function deepClone(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let newObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepClone(obj[key]);
}
}
return newObj;
}
- 循环
function deepClone(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let newObj = Array.isArray(obj) ? [] : {};
let queue = [obj];
while (queue.length) {
let temp = queue.shift();
for (let key in temp) {
if (temp.hasOwnProperty(key)) {
if (typeof temp[key] !== 'object' || temp[key] === null) {
newObj[key] = temp[key];
} else {
newObj[key] = Array.isArray(temp[key]) ? [] : {};
queue.push(temp[key]);
}
}
}
}
return newObj;
}
- 递归 + 循环
function deepClone(obj) {
if (typeof obj !== 'object' || obj === null) {
return obj;
}
let newObj = Array.isArray(obj) ? [] : {};
let queue = [obj];
let map = new Map();
while (queue.length) {
let temp = queue.shift();
if (map.has(temp)) {
return map.get(temp);
}
map.set(temp, newObj);
for (let key in temp) {
if (temp.hasOwnProperty(key)) {
if (typeof temp[key] !== 'object' || temp[key] === null) {
newObj[key] = temp[key];
} else {
newObj[key] = Array.isArray(temp[key]) ? [] : {};
queue.push(temp[key]);
}
}
}
}
return newObj;
}
- JSON.parse(JSON.stringify(obj))
- 会忽略 undefined、symbol、函数
- 不能序列化正则
- 不能解决循环引用的对象
function deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}