方法1 定义方法clone
function clone(obj) {
let copy;
if (obj instanceof Array) {
copy = [];
let i = obj.length;
while (i--) {
copy[i] = clone(obj[i]);
}
return copy;
} else if (obj instanceof Object) {
copy = {};
for (let k in obj) {
copy[k] = clone(obj[k]);
}
return copy;
} else {
return obj;
}
}
方法1缺点:无法拷贝函数
方法2 使用 JSON.stringify 和 JSON.parse 方法
var arr = ['old', 1, true, ['old1', 'old2'], {old: 1}]
var new_arr = JSON.parse( JSON.stringify(arr));
console.log(new_arr); // [ 'old', 1, true, [ 'old1', 'old2' ], { old: 1 } ]
方法2缺点:同样无法拷贝函数
方法3 定义deepClone函数
function deepClone(source) {
// 递归终止条件
if (!source || typeof source !== 'object') {
return source;
}
var targetObj = source instanceof Array ? [] : {};
for (var key in source) {
// 该方法会忽略掉那些从原型链上继承到的属性。
if (source.hasOwnProperty(key)){
// 避免死循环对象属性
if(source[key] === source){
console.warn(new Error('circular object'))
}else if (source[key] && typeof source[key] === 'object') { //数组 typeof的结果也是object
targetObj[key] = deepClone(source[key]);
} else {
targetObj[key] = source[key];
}
}
}
return targetObj;
}
var object1 = {'year':12, arr: [1, 2, 3], obj: {key: 'value' }, func: function(){return 1;}};
var object2 = [1,[2,[3,4,[5,6]]]]
var newObj= deepClone(object1);
var newObj2 = deepClone(object2)
console.log(newObj) // { year: 12,arr: [ 1, 2, 3 ],obj: { key: 'value' }, func: [Function: func] }
console.log(newObj2) // [ 1, [ 2, [ 3, 4, [Array] ] ] ]