浅拷贝、深拷贝

88 阅读1分钟

在进行拷贝之前,我们需要先了解js的数据类型,以及它们的存储方式

简单数据类型: Number、String、Boolean、null、undefined、Symbol

引用数据类型: Object、Array、Function

简单数据类型,将值存储在栈中;引用数据类型将值存储在堆中,而在栈中存放的是指向堆的指针。

浅拷贝

创建一个新对象,这个对象是有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 ,所以如果其中一个对象改变了这个地址,就会影响到另一个对象。

使用Object.assign()拷贝

let oldObj = {
    name : "zhangsan",
    sex : "male",
    hobbies : ["eat", "sleep"]
}

let newObj = Object.assign({},oldObj);
console.log("newObj = ",newObj);

// 修改newObj的值
newObj.name = "lisi";
newObj.hobbies.push("paly game");
console.log("oldObj = ", oldObj);
console.log("修改后的newObj = ", newObj);

使用for...in...拷贝

let oldObj = {
    name : "zhangsan",
    sex : "male",
    hobbies : ["eat", "sleep"]
}
    
let newObj = {};
for (const key in oldObj) {
    if (oldObj.hasOwnProperty(key)) {
        newObj[key]=oldObj[key]
    }
}
console.log("newObj = ",newObj);

// 修改newObj的值
newObj.name = "wangwu";
newObj.hobbies.push("play soccer");
console.log("oldObj = ", oldObj);
console.log("修改后的newObj = ", newObj);

由上面的代码执行的效果可以看出:修改基础类型的数据不会影响到原始数据但是修改引用数据类型的数据会同时改变原始数据

深拷贝

let oldObj = {
    name : "zhangsan",
    sex : "male",
    hobbies : ["eat", "sleep"]
}

let newObj= JSON.parse(JSON.stringify(oldObj));
console.log("JSON.stringify深拷贝newObj = ", newObj);

// 修改拷贝过来的newObj数据
newObj.hobbies.push('play');
console.log("原始数据oldObj = ", oldObj);
console.log("深拷贝的newObj = ", newObj);

先暂时写到这,后续再补充