深拷贝
- 未解决循环引用问题
- 在使用for in循环时,返回的是所有能够通过对象访问的、可枚举的属性,其中既包括存在于实例中的属性,也包括存在于原型中的属性。
function deeoCopy(obj){ let res if(typeof obj === 'object'){ res = obj instanceof Array ? [] : {} for(let key in obj){ if(obj.hasOwnProperty(key)){ res[key] = typeof obj[key] == 'object' ? deeoCopy(obj[key]) : obj[key] } } }else{ res = obj } return res }
- 已解决循环引用问题
function deepCopy(obj) { // hash表,记录所有的对象的引用关系 let map = new WeakMap(); function dp(obj) { let result = obj instanceof Array ? [] : {}; let keys = Object.keys(obj); let existobj = map.get(obj); //如果这个对象已经被记录则直接返回 if (existobj) { return existobj; } map.set(obj, result); for (let i = 0, len = keys.length; i < len; i++) { let key = keys[i]; let temp = obj[key]; if (temp && typeof temp === 'object') { result[key] = dp(temp); } else { result[key] = temp; } } return result; } return dp(obj); }
function deepCopy(obj) { let set = new WeakSet(); function dp(obj) { let result = obj instanceof Array ? [] : {}; let keys = Object.keys(obj); let existobj = set.has(obj); if (existobj) { return obj; } set.add(obj); for (let i = 0, len = keys.length; i < len; i++) { let key = keys[i]; let temp = obj[key]; if (temp && typeof temp === 'object') { result[key] = dp(temp); } else { result[key] = temp; } } return result; } return dp(obj); }
循环引用
let obj = {} obj.a = {} obj.a.b = obj.a
let obj = {} obj.a = {} obj.c = {} obj.a.b = obj.c obj.c.d = obj.a
以自己现在的努力程度,还没有资格和别人拼天赋