// 不考虑 对象中包含内置对象,循环引用
// function deepClone (origin) {
// if (typeof origin !== 'object' || origin === null) {
// throw Error('origin not a object')
// }
// const target = Object.prototype.toString.call(origin) === '[object Object]' ? {} : []
// for (let prop in origin) {
// if (origin.hasOwnProperty(prop)) {
// if (typeof origin[prop] === 'object' && origin[prop] !== null) {
// target[prop] = deepClone(origin[prop])
// } else {
// target[prop] = origin[prop]
// }
// }
// }
// return target
// }
var isObject = (target) => (typeof target === 'object') && target !== null
function deepClone(target, map = new WeakMap()) {
if (map.get(target)) {
return target;
}
// 获取当前值的构造函数:获取它的类型
let constructor = target.constructor;
// 检测当前对象target是否与正则、日期格式对象匹配
if (/^(RegExp|Date)$/ig.test(constructor.name)) {
// 创建一个新的特殊对象(正则类/日期类)的实例 var set = new S
return new constructor(target);
}
const cloneTarget = Array.isArray(target) ? [] : {};
if (isObject(target)) {
map.set(target, true); // 为循环引用的对象做标记
for (let prop in target) {
if (target.hasOwnProperty(prop)) {
if (isObject(target[prop])) {
cloneTarget[prop] = deepClone(target[prop], map);
} else {
cloneTarget[prop] = target[prop]
}
}
}
}
return cloneTarget
}
// var str = {};
// var obj = { a: {a: "hello", b: 21} };
// deepClone(obj, str);
// console.log(str.a);
var obj1 = {
a: 1,
b: {
b1: 2
},
c: function() {
console.log('abc')
},
d: /\s/g,
f: undefined,
g: null,
date: new Date(),
}
// obj1.e = obj1
// Object.prototype.hasOwnProperty
// o
// var obj2 = JSON.parse(JSON.stringify(obj1))
// var obj2 = deepClone(obj1)
var obj2 = deepClone(obj1)
// obj1.b.b1 = 5
console.log(obj1)
console.log(obj2)
js 深拷贝
最新推荐文章于 2024-07-21 16:41:56 发布
这篇博客探讨了JavaScript中的深拷贝实现,通过一个名为`deepClone`的函数展示了如何处理对象和数组的递归复制,同时处理了循环引用、内置对象如正则和日期,以及null和undefined的情况。示例中给出了一个复杂对象`obj1`的深拷贝过程,并展示了拷贝前后对象的独立性。
摘要由CSDN通过智能技术生成