functiondeepClone(target) { // ... // Map 对象使用迭代器迭代 if (target instanceofMap) { let newMap = newMap() for (const [key, val] of target) { if (isObject(val)) newMap.set(key, clone(val)) else newMap.set(key, val) } return newMap }
// Set 对象使用迭代器迭代 if (target instanceofSet) { let newSet = newSet() for (const val of target) { if (isObject(val)) newSet.add(clone(val)) else newSet.add(val) } return newSet } }
Array
Array也是直接遍历即可,遇到引用数据类型直接递归调用深拷贝
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
functiondeepClone(target) { // ... // Array 直接遍历即可 if (target instanceofArray) { const n = target.length let newArray = newArray(n) for (let i=0;i<n;i++) { const item = target[i] if (isObject(item)) newArray[i] = clone(item) else newArray[i] = item } return newArray } }
// 考虑循环引用问题 如果该对象已存在,则直接返回该对象 if (hashMap.has(target)) return hashMap.get(target)
// Date 与 RegExp 对象可直接使用构造器构建 if ([Date, RegExp].includes(target.constructor)){ returnnew target.constructor(target) }
// Function 可以使用构造器构造 if (target instanceofFunction) { returnnewFunction('return ' + target.toString())() }
// Map 对象使用迭代器迭代 if (target instanceofMap) { let newMap = newMap() for (const [key, val] of target) { if (isObject(val)) newMap.set(key, clone(val)) else newMap.set(key, val) } return newMap }
// Set 对象使用迭代器迭代 if (target instanceofSet) { let newSet = newSet() for (const val of target) { if (isObject(val)) newSet.add(clone(val)) else newSet.add(val) } return newSet }
// Array 数组使用迭代器迭代 if (target instanceofArray) { const n = target.length let newArray = newArray(n) for (let i=0;i<n;i++) { const item = target[i] if (isObject(item)) newArray[i] = clone(item) else newArray[i] = item } return newArray }
// Object 对象 // 考虑 symbol 与 string 为 key const keys = Reflect.ownKeys(target) let newObj = {} for (const key of keys) { const val = target[key] if (isObject(val)) newObj[key] = clone(val) else newObj[key] = val } // Object 保存在 weakMap 中 防止之后的循环引用 hashMap.set(target, newObj) return newObj }