浅克隆有别于直接赋值,而是克隆原始对象中的属性并填充到一个新的对象中。克隆前后的两个对象中的属性能够共享数据但不共享内存,从而达到修改其中一个对象的属性值不会影响到另一个对象的属性。还有一点要强调,克隆除了克隆数据,还得克隆类型
不废话了,直接写浅克隆的逻辑:
function shallowClone(target) {
if (typeof target !== 'object' || target === null) {
return target
}
const result = Array.isArray(target) ? [] : {}
for (let key in target) {
result[key] = target[key]
}
return result
}
深克隆是不仅要克隆原始对象中的属性,还要递归地对原始对象中的每个属性执行一次深克隆操作,从而实现克隆前后的两个对象完全不具有任何关联。同样,深克隆也会像浅克隆那样既克隆数据又克隆类型
不废话,直接展示深克隆逻辑:
function deepClone(target) {
// cache是实现克隆循环引用的关键
const cache = new WeakMap()
function _deepClone(target) {
if (typeof target !== 'object' || target === null) {
return target
}
if (cache.has(target)) {
return cache.get(target)
}
const result = Array.isArray(target) ? [] : {}
cache.set(target, result)
Object.setPrototypeOf(result, Object.getPrototypeOf(target))
for (let key in target) {
if (target.hasOwnProperty(key)) {
result[key] = _deepClone(target[key])
}
}
return result
}
return _deepClone(target)
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。