递归调用
function checkType (origin) {
return Object.prototype.toString.call(origin).slice(8, -1);
}
function deepClone (origin) {
let type = checkType(origin);
let target;
if (type === 'object') {
target = {};
} else if (type === 'array') {
target = [];
} else {
return origin;
}
for (let prop in origin) {
if (origin.hasOwnProperty(prop)) {
if (origin[prop] !== null && typeof origin[prop] === 'object') {
target[prop] = deepClone(origin[prop]);
} else {
target[prop] = origin[prop];
}
}
}
return target;
}
let a = null;
let arr = [1,2,[3,4],null,true,undefined];
let arr1 = [1,2,{user:'a'}];
let obj = {a: 1, b: 2, c: {d: [3,4]}, e: function fun(){}};
console.log(deepClone(a)); // null
console.log(deepClone(arr)); // [ 1, 2, [ 3, 4 ], null, true, undefined ]
console.log(deepClone(arr1)); // [ 1, 2, { user: 'a' } ]
console.log(deepClone(obj)); // { a: 1, b: 2, c: { d: [ 3, 4 ] }, e: [Function: fun] }
JSON.parse(JSON.stringify(obj))
被克隆的对象为 JSON 格式,即不能包括函数
const obj1 = {a: {b: 1}};
const deepCopy = obj => JSON.parse(JSON.stringify(obj));
const obj2 = deepCopy(obj1);
obj1.a.b = 2;
obj2.a.b // 1
网友评论