深拷贝我在开发的时候经常会遇到与实现,但是原来是不知道叫做深拷贝,知道看见一些推文的时候才醒悟过来。深拷贝其实就是为了解决引用类型数据的复制问题,引用类型的数据如果你用“=”号进行复制的时候,只是复制了地址,这是浅拷贝,当源数据与复制数据之中不管是谁修改一些值的时候,另一个的值也会跟着变,这就不好了。
对于深拷贝与浅拷贝的形象理解就是:
浅拷贝:张三换了一个名叫做李四,两个名字其实都是一个人,张三干了坏事其实也是李四干了坏事
深拷贝:通过克隆技术将张三克隆了一个,叫做李四,这两个长的一模一样,但是是两个个体,他俩干啥都不会影响另一个
如果确定是对象以及没有function
,undefined
,null
时可以考虑使用JSON.stringify
和JSON.parse
简单粗暴解决,但如果存在这三种类型时是行不通的,这三个会被忽略,那么解决就是如下:
<script>
let obj = {
a: 1,
b: { b1: "qwe", b2: "asd", b3: "zxc" },
c: function () {
console.log("ccc")
},
d: [1, 2, 3, 4],
e: undefined,
f: null,
g: false
}
let arr = [1, "2", { id: 1, name: "张三" }, undefined, null, "", function () { console.log("ccc") }];
function deepCopy(obj) {
let result = Array.isArray(obj) ? [] : {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
// 这里注意null的typeof是object!!!
if (typeof obj[key] === "object" && obj[key] !== null) {
result[key] = deepCopy(obj[key]);
}
else {
result[key] = obj[key];
}
}
}
return result;
}
let deepCopyResult = deepCopy(obj);
console.log(deepCopyResult);
</script>