2022-04-20——对象拷贝

什么是浅拷贝,深拷贝以及和他们之间的区别:

浅拷贝:是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 。

深拷贝:是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象。

区别:浅拷贝基本类型之前互不影响,引用类型其中一个对象改变了地址,就会影响另一个对象;深拷贝
改变新对象不会影响原对象,他们之前互不影响。

一、对象拷贝有什么意义:

在开发项目的过程中,我们如何得到两个相同的对象:
例如:stu_1 = {name: "xiaoming"};stu_2 = {name: "xiaoming"};
通过赋值仅仅是赋值了一个引用,而这两个变量仍然指向同一个对象;
使用对象克隆技术,才能得到真正的,两个相同的对象

二、对象克隆的使用场景

1、将对象作为函数参数的时候,不希望操作原对象。
2、面试常见问题。

三、拷贝的算法

1、浅拷贝(被拷贝对象的属性值全是原始类型)

let stu = {
    name: "xiaoming",
    age: 10
};

function copyObject(obj){  //传进来一个对象得到一个对象副本
    let newObj = {}
    
    // 拷贝的算法
    for(let i in obj){
        newObj[i] = obj[i]
    }
    
    // 返回新对象
    return newObj
}

let newStu = copyObject(stu)
stu.age = 20
                
console.log(stu)
console.log(newStu)

2、深拷贝

let stu = {
    name: "xiaoming",
    age: 10,
    bestFriend:{
        name:"xiaohong",
        age:10
    }
};


// 深拷贝
function copyObject(obj) {
    let newObj = {}

    // 拷贝的算法
    for (let i in obj) {
        if(obj[i] instanceof Object){
            newObj[i] = copyObject(obj[i])  //函数递归
        }else{
            newObj[i] = obj[i]
        }
    }

    // 返回新对象
    return newObj
}

let newStu = copyObject(stu)
stu.age = 20

console.log(stu)
console.log(newStu)

3、实现深拷贝的方法

1、递归
2、转JSON(通过字符串转义,将引用类型转为原始类型,再复制原始类型的值)

let stu = {
    name: "xiaoming",
    age: 10,
    bestFriend: {
        name: "xiaohong",
        age: 10
    }
};

let stuStr = JSON.stringify(stu)
let newStu = JSON.parse(stuStr)

stu.age = 20

console.log(stu)
console.log(newStu)

2、

你可能感兴趣的:(2022-04-20——对象拷贝)