背景
思路
- 使用
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}