深克隆与浅克隆
TIP
深克隆
与浅克隆
是前端人必须掌握的知识,他不是说面试的时候会到问他,是关乎到你写的程序是否会发生错误。浅克隆
是克隆一层数据,更改第二层数据的时候就会影响到原始数据了。深克隆
是深度拷贝一个数据,跟原始数据没有什么关系,不会相互受影响。
浅克隆
TIP
在对象和数组的方法常遇到的浅克隆
api: 有Object.assign(数组/对象)
、...(扩展运算符(数组/对象)
、concat(数组)
、slice(数组)
。就列举下吧,就不多写示例了,用的时候⚠️。
深克隆
TIP
常见的深克隆有JSON.parse(JSON.stringify(数组/对象))
,还有递归把一个数组/对象放到一个新的对象/数组里面实现cloneDeep
。
JSON.parse(JSON.stringify())
WARNING
优点
: 可以快速实现一个深克隆,方便省事。缺点
: 如果对象或者数组中有函数,在克隆过程中会丢失。
示例:
js
// 这个样深克隆实现没问题。
const originObject = { name: 1, age: 1 };
const targetObject = JSON.parse(JSON.stringify(originObject));
// 带函数的对象
const originObjectFn = { name: 1, age: 1, fn(){} };
const targetObjectFn = JSON.parse(JSON.stringify(originObjectFn));
console.log(targetObjectFn, 'targetObjectFn');
// 这个时候会发现fn方法丢失。
实现一个cloneDeep
方法。
TIP
cloneDeep
方法是咱们工作中使用最的克隆手段,咱们一起看看他的实现。
示例:
js
function cloneDeep(source) {
//判断它是数组 还是对象 定义一个新的数组或者对象
const target = Array.isArray(source) ? [] : {};
for (const key in source) {
if (source.hasOwnProperty(key)) { // 检测是否有该属性
if (source[key] && typeof source[key] === "object") {
target[key] = cloneDeep(source[key]); // 递归
} else {
target[key] = source[key];
}
}
}
return target
}