js---copia profunda

Copia superficial: el tipo de datos de referencia simplemente asigna la dirección de referencia a otra variable al asignar un valor.Después de la asignación, las dos variables apuntan a la misma dirección en la memoria del montón, y cualquier operación se afectará entre sí.

 

Copia profunda: el tipo de datos de referencia copia todo el contenido en otra variable. Se crea un nuevo espacio en la memoria del montón para los datos copiados. Las dos variables en realidad apuntan a dos direcciones de referencia y las operaciones posteriores no se afectan entre sí.

 Tres ideas de implementación de copia profunda:

1. Recorrido transversal + recursividad (la recursividad es para garantizar que la copia no esté completa cuando hay anidamiento en los datos y las operaciones posteriores de las dos variables se afectan entre sí)

El primer paso: bucle transversal (recorrer cada propiedad de un objeto, agregar cada propiedad del objeto y su valor a otro objeto)

Paso 2: encapsule la función (realice la copia profunda del objeto, y el valor de retorno es el objeto después de la copia profunda)

Paso 3: Array.isArray(): determina si una cosa es una 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);

El resultado de ejecutar el código:

 2. Método JSON

JSON.stringify () : Convierta el objeto JSON en una cadena JSON (la cadena json requiere que cada nombre de atributo en la cadena se envuelva con " ", sin comentarios, sin comas adicionales)

JSON.parse (): convierte una cadena JSON en un 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);

El resultado de ejecutar el código: 

3. asignar función  (de hecho, solo realiza la copia de las propiedades de primer nivel del objeto, y también es una copia superficial en esencia):

Es equivalente al proceso de "juzgar si el valor del atributo clave es un tipo de referencia en obj1, y si lo es, debe continuar recorriendo el valor del atributo (procesar recursivamente el valor del atributo)" y este proceso no se ejecuta

var obj2=Objeto.asignar({ },obj)

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

Supongo que te gusta

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