深拷贝
- 未解决循环引用问题
- 在使用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

以自己现在的努力程度,还没有资格和别人拼天赋

浙公网安备 33010602011771号