题目
请补全JavaScript代码,要求实现对象参数的深拷贝并返回拷贝之后的新对象。
注意:
1. 需要考虑函数、正则、日期、ES6新对象
2. 需要考虑循环引用问题
编辑
核心代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>深拷贝</title> </head> <body> <!-- 首先判断对象参数是否为“null”,是则返回“null” 判断对象参数数据类型是否为“object”,不是则返回该参数 获取到对象参数的构造函数名,判断是否为函数、正则、日期、ES6新对象其中之一,如果是则直接返回通过该参数对象对应的构造函数生成的新实例对象 当以上条件判断之后函数依然没有结束时继续进行以下操作 在Map对象中获取当前参数对象,如果能获取到,则说明这里为循环引用并返回Map对象中该参数对象的值 如果在Map对象中没有获取到对应的值,则保存该参数对象到Map中,作为标记 根据该参数的数据类型是否为数组创建新对象 遍历该对象参数,将每一项递归调用该函数本身的返回值赋给新对象 --> <script type="text/javascript"> const _completeDeepClone = (target, map = new Map()) => { // 补全代码 if (target === null) return target if (typeof target !== 'object') return target const constructor = target.constructor if (/^(Function|RegExp|Date|Map|Set)$/i.test(constructor.name)) return new constructor(target) if (map.get(target)) return map.get(target) map.set(target, true) const cloneTarget = Array.isArray(target) ? [] : {} for (prop in target) { if (target.hasOwnProperty(prop)) { cloneTarget[prop] = _completeDeepClone(target[prop], map) } } return cloneTarget } </script> </body> </html>
