乞丐版
var cloneObject = {
// ...省略代码
}
var cloneTarget = JSON.parse(JSON.stringify(cloneObject));
注:可以应对大部分的应用场景(数组、对象),但是它还是有很大缺陷的,比如拷贝其他引用类型、拷贝函数、循环引用等情况
基础版本
function clone(cloneObject, map = new Map()) { // 用Map在垃圾回收机制中为强引用;即使cloneObject = null,Map中还是有对cloneObject原堆地址引用
if (typeof target === 'object') {
let cloneTarget = Array.isArray(target) ? [] : {};
if (map.get(target)) {
return map.get(cloneObject);
}
map.set(target, cloneTarget);
for (const key in cloneObject) {
cloneTarget[key] = clone(cloneObject[key], map);
}
return cloneTarget;
} else {
return target;
}
};
关于
注:可以使用WeakMap,原对象引用垃圾回收后map相应属性也被delete
function clone(cloneObject, map = new Map()) {
// ...省略代码
}
你不知道的 WeakMap-涉及内存收-阿宝哥
理解 WeakMap 的 weak
WeakMap and WeakSet(弱映射和弱集合)
阮一峰-WeakMap
终极版
注:看lodash源码