js---cópia profunda

Cópia rasa: O tipo de dado de referência apenas atribui o endereço de referência a outra variável ao atribuir um valor. Após a atribuição, as duas variáveis ​​apontam para o mesmo endereço na memória heap e quaisquer operações afetarão uma à outra.

 

Cópia profunda: o tipo de dados de referência copia todo o conteúdo para outra variável e um novo espaço é criado na memória heap para os dados copiados. As duas variáveis ​​na verdade apontam para dois endereços de referência e as operações subsequentes não afetam uma à outra.

 Três ideias de implementação de deep copy:

1. Percurso + recursão (recursão é para garantir que a cópia não seja completa quando houver aninhamento nos dados e as operações subsequentes das duas variáveis ​​se afetem)

A primeira etapa: Loop Traversal (percorrer cada propriedade de um objeto, adicionar cada propriedade do objeto e seu valor a outro objeto)

Etapa 2: Encapsule a função (realize a cópia profunda do objeto e o valor de retorno é o objeto após a cópia profunda)

Etapa 3: Array.isArray(): determine se uma coisa é uma matriz

三元运算符
条件?对:不对//判断obj是否是数组类型,若是,则obj2被初始化为[],否则{}
    if (Array.isArray(obj) == true) {
        var obj2 = []
    } else {
        var obj2 = {}
    }
    var obj = { name: '李煜', age: 30, sex: true, hobby: ['打球', '听音乐'] };
    function copyObj(obj) {
        // // 判断obj2是否是数组类型
        // var obj2 = Array.isArray(obj)
        // // 如果obj2是数组类型则将obj2初始化为空数组,否则初始化为空对象
        // if (obj2){
        //     obj2=[]
        // }else{
        //     obj2={}
        // }
        var obj2 = Array.isArray(obj) ? [] : {}
        for (var key in obj) {
            // //判断属性值是否为引用类型,如果是引用类型,则需要继续循环遍历处理该属性的值(递归)
            // if (typeof obj[key] == 'object') {
            //     obj2[key] = copyObj(obj[key])
            // }else{//不是引用类型, 直接拷贝该属性的值
            //     obj2[key] = obj[key]
            // }
            obj2[key] = (typeof obj[key] == 'object' ? copyObj(obj[key]) : obj[key])

        }
        return obj2
    }
    var obj2 = copyObj(obj)
    console.log(obj, obj2);
    obj.hobby.push('coding')
    console.log(obj, obj2);

O resultado da execução do código:

 2. Método JSON

JSON.stringify (): Converte o objeto JSON em string JSON (a string json requer que cada nome de atributo na string seja agrupado com " ", sem comentários, sem vírgulas extras)

JSON.parse (): converte uma string JSON em um objeto JSON

var obj = { name: '李煜', age: 30, sex: true, hobby: ['打球', '听音乐'] };
var obj2=JSON.parse(JSON.stringify(obj))
console.log(obj, obj2);
obj.hobby.push('coding')
console.log(obj, obj2);

O resultado da execução do código: 

3. atribuir função  (na verdade, ele apenas realiza a cópia das propriedades de primeiro nível do objeto e também é uma cópia superficial em essência):

É equivalente ao processo de "julgar se o valor do atributo-chave é um tipo de referência em obj1 e, se for, você precisa continuar a percorrer o valor do atributo (processar recursivamente o valor do atributo)" e este processo não é executado

var obj2=Object.assign({ },obj)

var obj = { name:'李煜', age:30,sex:true,hobby:['打球','听音乐'] };
var obj2 = Object.assign( {}, obj );
console.log( obj, obj2 );   
obj.hobby.push('coding');

Acho que você gosta

Origin blog.csdn.net/m0_53149377/article/details/127725985
Recomendado
Clasificación