手写深拷贝
# 手写深拷贝
浅拷贝:仅仅是复制了引用,彼此之间的操作会互相影响
Array 的 slice
和 concat
方法并不是真正的深拷贝,对于 Array 的第一层的元素是深拷贝,而 Array 的第二层 slice
和 concat
方法是复制引用。所以 Array 的 slice
和 concat
方法都是浅拷贝。
深拷贝:在堆中重新分配内存,不同的地址,相同的值,互不影响
JSON.parse() 和 JSON.stringify()
JSON.stringify() 把一个 js 对象序列化为一个 JSON 字符串 JSON.parse() 把 JSON 字符串反序列化为一个 js 对象
手写深拷贝:利用递归来实现对对象或数组的深拷贝
递归思路:对属性中所有引用类型的值进行遍历,直到是基本类型值为止。
function deepCopy(obj) {
if (!obj && typeof obj !== 'object') {
throw new Error('error arguments');
}
// const targetObj = obj.constructor === Array ? [] : {};
const targetObj = Array.isArray(obj) ? [] : {};
for (let key in obj) {
//只对对象自有属性进行拷贝
if (obj.hasOwnProperty(key)) {
if (obj[key] && typeof obj[key] === 'object') {
targetObj[key] = deepCopy(obj[key]);
} else {
targetObj[key] = obj[key];
}
}
}
return targetObj;
}