我的一位好朋友在面试的时候面到了深浅克隆的问题,
浅克隆:可以直接赋值做到,但是他们引用的都是同一个地址,所以原来的改变了,浅克隆过后的数据他也回跟随其变化.
深克隆:他是直接独立出来了,克隆了一个新的出来,改变了其引用地址,所以与浅克隆相反.
我还是拿下面这个数据格式作为克隆对象 👇
它里面是有对象,有函数和数组
const obj = {
"childrenList": [{
"childrenList": [{
"childrenList": () => {
console.log(this)
},
"id": 5,
"name": "子节点11",
"pId": 3,
"type": "1"
}],
"id": 3,
"name": "子节点1",
"pId": 1,
"type": "1"
}],
"id": 1,
"name": "根节点1",
"pId": 0,
"type": "1"
}
话不多说,直接上代码.
function clone(num) {
// 申明一个变量,不赋值,因为他有可变性
let data;
// 判断 是否为对象
if (num instanceof Object) {
// 函数是引用
if (num instanceof Function) {
return new Function('return '+num.toString()).call(this)
} else if (num instanceof Array) {
// 如果数组 递归遍历就好啦
data = [];
for (let v in num) {
data.push(clone(num[v]));
}
} else {
// 同数组一样
data = {};
for (let v in num) {
data[v] = clone(num[v]);
}
}
} else {
// 基本数据类型 直接赋值就好啦
data = num;
}
return data;
}
console.log(clone(obj));
以下是我深克隆之后拿到的数据 👇
如果对你有帮助的话麻烦点个关注吧(感谢啦)