实现一个深拷贝

1.如果是函数类型和普通类型直接返回原来的值。 2.如果是正则,直接返回原来的值。 3.如果是日期类型,直接返回原来的值。 4.需要新建一个WeakMap的表用来存储被拷贝过的值,并且在递归的时候传下去,这样可以避免对象引用自己造成无限递归。 5.拷贝的时候只拷贝对象的私有属性。 //deepClone const deepClone = (value, hash = new WeakMap) => { if(value == null){ // 这里排除掉null 和 undefine 因为null == undefine return false } if(typeof value !== 'object') return value // 这里包含了函数类型 if(value instanceof RegExp) return new RegExp(value) if(value instanceof Date) return new Date(value) // 根据当前属性构造一个新的实例 let instance = new value.constructor // 这里做一下防止循环引用的处理 if(hash.has(value)){ return hash.get(value) } hash.set(value, instance) // 已经拷贝过的存放在表里作为记录 for (const key in value) { if (value.hasOwnProperty(key)) { // 只拷贝私有属性 instance[key] = deepClone(value[key], hash) // 这里表向下传递作为记录 } } return instance } // test let obj = { name: 'teacc', age: 25, other:{ a: 1 } } obj.b = obj let cloneObj = deepClone(obj) cloneObj.other.a = 2 console.log(obj)

本文章由javascript技术分享原创和收集

发表评论 (审核通过后显示评论):