参考了阮一峰的深拷贝(阮一峰的深拷贝对数组来说,不是很严谨,会有问题,自己改进了下)
1、简单版(只考虑是引用对象的情况)
<script>
// 深拷贝方法
function deepCopy(data) {
var c = data.constructor === Array ? [] : {};
for(var k in data) {
if (typeof data[k] === 'object') {
c[k] = deepCopy(data[k]);
} else {
c[k] = data[k];
}
}
return c;
};
var data1 = [{
a: 1
}, 1, 2];
var data2 = {
a: 1212,
c: {
b: 1,
d: [4, 5, 6]
},
d: [1, 2, 3]
}
console.log(deepCopy(data1));
console.log(deepCopy(data2));
</script>
2、全面版
- 需要考虑函数、正则、日期、ES6新对象
- 需要考虑循环引用问题
const _completeDeepClone = (target, map = new Map()) => {
if(target === null) return target
if(typeof target !== 'object') return target
const constructor = target.constructor
if(/^(Function|RegExp|Date|Map|Set)$/i.test(constructor.name)) return new constructor(target)
if(map.get(target)) return map.get(target)
map.set(target, true)
const cloneTarget = Array.isArray(target) ? [] : {}
for(var prop in target) {
cloneTarget[prop] = _completeDeepClone(target[prop], map)
}
return cloneTarget
}