js 深拷贝和浅拷贝

1、浅拷贝

    const obj = {
        name: ‘张三‘,
        age: 18,
        friend: {name: ‘小夏‘}
    }

    const newObj = obj
    obj.age = 20
    console.log(obj.age)  // 20
    console.log(newObj.age) // 20

直接用等于的方式进行拷贝,但是如果直接改变一个对象的某个属性,另一个对象对应属性值也会跟着改变

2、深拷贝

方法1

思路:如果不是对象、数组或为null 直接拷贝,若是对象或数组则循环拷贝每个属性,这样拷贝出来的变量和之前的变量改变值不会互相影响

    const obj = {
        name: ‘张三‘,
        age: 18,
        friend: {name: ‘小夏‘}
    }

    function deepClone(obj) {
        if(typeof(obj) != ‘object‘ || typeof(obj) == null) {
            return obj
        }else {
            let result
            if(obj instanceof Array) { // 数组
                result = []
            }else { // 对象
                result = {}
            }
            for(let key in obj) {
                // 若直接等于,改变某个的friend另一个也会改变,故用递归
                //  result[key] = obj[key]
                result[key] = deepClone(obj[key])
            }
            return result
        }
    }
    let newObj = deepClone(obj)
    newObj.age = 20
    console.log(obj.age)  // 18
    console.log(newObj.age) // 20

方法二

思路:判断是否是对象或数组,若是转成json字符串再转过,若不是直接返回

    const obj = {
        name: ‘张三‘,
        age: 18,
        friend: {name: ‘小夏‘}
    }

    function deepClone(obj) {
        if(typeof(obj) != ‘object‘ || typeof(obj) == null) {
            return obj
        }else {
            return JSON.parse(JSON.stringify(obj))
        }
    }
    let newObj = deepClone(obj)
    newObj.age = 20
    console.log(obj.age)  // 18
    console.log(newObj.age) // 20

 

js 深拷贝和浅拷贝

上一篇:HttpRunner自动化测试框架


下一篇:Python paste模块和routes模块