Cópia profunda manuscrita recursiva

premissa:

A cópia profunda e a cópia superficial são apenas para tipos de dados de referência, como Object e Array.

1. Pilha de memória

Veja outro tipo de dados de blog e armazenamento em pilha especificamente

2. Cópia superficial e cópia profunda

Os diagramas esquemáticos de cópia profunda e cópia rasa são aproximadamente os seguintes:Insira a descrição da imagem aqui

A cópia superficial apenas copia o ponteiro para um objeto, não o próprio objeto.Os objetos antigos e novos ainda compartilham a mesma memória. Mas uma cópia profunda criará outro exatamente o mesmo objeto. O novo objeto não compartilha memória com o objeto original. Modificar o novo objeto não mudará o objeto original.

A diferença entre atribuição e cópia superficial

Tarefa:

Ao atribuir um objeto a uma nova variável, a atribuição é, na verdade, o endereço do objeto na pilha, não os dados no heap. Ou seja, dois objetos apontam para o mesmo espaço de armazenamento. Não importa qual objeto seja alterado, na verdade é o conteúdo do espaço de armazenamento alterado. Portanto, os dois objetos estão ligados.

Cópia superficial:

A cópia superficial é uma cópia bit a bit de um objeto. Ela cria um novo objeto que possui uma cópia exata dos valores de atributo do objeto original. Se o atributo for um tipo básico, o valor do tipo básico é copiado; se o atributo for um endereço de memória (tipo de referência), o endereço de memória é copiado, portanto, se um objeto alterar este endereço, afetará o outro objeto. Ou seja, o construtor de cópia padrão executa apenas uma cópia superficial do objeto (cópia membro por membro, por sua vez), ou seja, apenas copia o espaço do objeto sem copiar os recursos.

Cópia profunda manuscrita (recursiva):

/**
 * 深拷贝
 */

const obj1 = {
    
    
    age: 20,
    name: 'xxx',
    address: {
    
    
        city: 'beijing'
    },
    arr: ['a', 'b', 'c']
}

const obj2 = deepClone(obj1)
obj2.address.city = 'shanghai'
obj2.arr[0] = 'a1'
console.log(obj1.address.city)
console.log(obj1.arr[0])

/**
 * 深拷贝
 * @param {Object} obj 要拷贝的对象
 */
function deepClone(obj = {
    
    }) {
    
    
    if (typeof obj !== 'object' || obj == null) {
    
    
        // obj 是 null ,或者不是对象和数组,直接返回
        return obj
    }

    // 初始化返回结果
    let result
    if (obj instanceof Array) {
    
    
        result = []
    } else {
    
    
        result = {
    
    }
    }

    for (let key in obj) {
    
    
        // 保证 key 不是原型的属性
        if (obj.hasOwnProperty(key)) {
    
    
            // 递归调用!!!
            result[key] = deepClone(obj[key])
        }
    }

    // 返回结果
    return result
}

Acho que você gosta

Origin blog.csdn.net/weixin_43638968/article/details/109243067
Recomendado
Clasificación