背景
思路
- 使用
Set
保存拷贝过程中遇到的对象 - 进一步拷贝过程中如果再次出现该对象,则返回该对象(循环引用的特征)
代码实现
function deepClone(source, set = new Set()){
const isPrimitive = deepClone.isPrimitive = deepClone.isPrimitive || (value => Object(value) !== value)
if (isPrimitive(source) || !source) return source
if (set.has(source)) return {...source}
set.add(source)
const target = Array.isArray(source) ? [] : {}
for (const [key, value] of Object.entries(source)) {
if (isPrimitive(value)) target[key] = value
else target[key] = deepClone(value, set)
}
return target
}