/**
* 深拷贝
* @param {Object} obj 要拷贝的对象
* @param {Map} map 用于存储循环引用对象的地址
*/
function deepClone(obj = {}, map = new Map()) {
//-------如果非引用类型, 直接返回值本身-------------------
if (typeof obj !== "object") {
// ! == null array obj
return obj;
}
//----------如果已存在该key值, 则返回该key的value----------------
if (map.get(obj)) {
return map.get(obj);
}
//---------初始化返回结果-----------------
let result = {};
//---------如果是数组, 则返回数组------------
if (
obj instanceof Array ||
// 加 || 的原因是为了防止 Array 的 prototype 被重写,Array.isArray 也是如此
Object.prototype.toString.call(obj) === "[object Array]"
) {
result = [];
}
// 防止循环引用
map.set(obj, result);
//---------循环-----------------
// 列: obj = { a:4, b:5 };
// obj = [ 1, 2 , 3 , 4];
for (const key in obj) {
// 保证 key 不是原型属性
if (obj.hasOwnProperty(key)) {
// 递归调用
debugger
result[key] = deepClone(obj[key], map);
}
}
//--------返回结果-----------------
return result;
}
let str = [1,2,3,5];
let str2 = {
a:4,
b:5
};
let s1 = deepClone( str);
let s3 = deepClone( str2);
// s1[1] = 6;
s3.a = 8
// console.log(str)
console.log(str2)
// console.log(s1)
console.log(s3)
// console.log(deepClone('aaa'))
let map = new Map();
map.set('a',{aa:'123'})
map.set('b',{ab:'123'})
map.forEach((i)=>{
console.log(
)
})