let str = 'dsfldskj';
let arr = [2, 2, 2, 2, 4, {a: 1}, [4, 5, 6,[34,32]]];
function fn() {
return 5;
}
let obj = {name: 'sdd', key: 1};
let num = 9;
let q = null;
function checkedType(target) {//调用父类(原型)Object的toString()方法来判断其类型
return Object.prototype.toString.call(target).slice(8, -1);
}
console.log(checkedType(str), checkedType(arr), checkedType(fn), checkedType(obj), checkedType(num), checkedType(q));//String Array Function Object Number Null
function clone(target) {
let result, targetType = checkedType(target);
if (targetType === 'Object') {//对象类型
result = {};
} else if (targetType === 'Array') {//数组类型
result = [];
} else {//其它类型直接clone
return target;
}
for (let i in target) {//遍历目标
let val = target[i];
if (checkedType(val) === 'Object' || checkedType(val) === 'Array') {
result[i] = clone(val);//如果单项中仍然是对象或数组,则采用递归继续判断克隆直至不是对象或数组
} else {
result[i] = val;//如果不是直接clone
}
}
return result;
}
let arr4 = clone(obj);
let arr5 = clone(arr);
console.log(arr4, arr5);
//{name: "sdd", key: 1}
//[2, 2, 2, 2, 4, {a: 1}, [4, 5, 6,[34,32]]]
js原生深度克隆
最新推荐文章于 2024-03-08 11:39:46 发布