Implementación de copia profunda y copia superficial (1)
En primer lugar, entendemos los siguientes dos tipos de datos:
1. Tipos básicos: números, cadenas y booleanos son todos tipos básicos.
2. Tipos complejos: objetos y arrays.
Entonces echemos un vistazo a la copia superficial y la copia profunda respectivamente. La copia profunda y la copia superficial solo se aplican a tipos complejos como objetos y matrices.
Copia superficial:
Se puede ver que para un tipo de objeto o matriz, cuando asignamos A a B y luego cambiamos los atributos en B, A también responderá a los cambios en consecuencia. . Es decir, A y B apuntan a la misma memoria, por lo que si modifica algún valor, el otro valor cambiará. Esta es una copia superficial.
Copia profunda:
Acabamos de saber qué es una copia superficial. En consecuencia, si B se coloca en una nueva memoria, todos los atributos de A se copian en la nueva memoria. memoria, esa es una copia profunda.
En otras palabras, cuando los atributos en B cambian, los atributos en A no cambiarán.
Entonces, además de la simple referencia de asignación anterior, ¿qué otros métodos utilizan la copia superficial?
Object.assign()
Presentación de object.assign() en MDN: "El método object.assign() se utiliza para asignar los valores de todas las propiedades enumerables de una o más Copie el objeto de origen al objeto de destino.
Copiar un objeto
Como puede ver, Object.assign() solo copia el valor de propiedad del objeto de origen. El valor de la propiedad es una referencia al objeto, solo copia el valor de referencia. Por lo tanto, Object.assign() solo se puede usar para copiar o fusionar objetos superficialmente.
Hablemos de copia profunda compleja
jQuery.extend()
Cuando se trata de copia profunda, lo primero que me viene a la mente es el método jQuery.extend(). Echemos un vistazo breve al uso de jQuery. .extend().
JQuery. extend ([deep], target, object1 [, objectn]), donde deep es un valor booleano. >
Usemos los datos anteriores para observar el método extend()
Como se puede ver en la comparación anterior, cuando se usa extend() para copia profunda, todas las propiedades del objeto son. agregado al objetivo
Sabemos que extend() puede realizar copias profundas, entonces, ¿cómo implementa extend() la copia profunda?
Echemos un vistazo a jQuery extend(. ) código fuente.
Mire principalmente la parte sobre copia profunda. Si es booleano, asígnelo a deep. Si deep es verdadero (es decir, copia profunda), llame a extend(. ) de forma recursiva, agregando así todas las propiedades del objeto al objetivo para lograr una copia profunda
JSON.parse() y JSON.stringify()
El código fuente de jQuery anterior te deslumbra. ¿Hay alguna forma de lograr una copia profunda sin cerebro? JSON.parse() y JSON.stringify() nos dan una solución básica.
Se puede ver que cambiar targetCopy no cambia el objetivo. las propiedades heredadas no se pierden, por lo que se logra una copia profunda básica
Pero hay un problema con JSON.parse() y JSON.parse()
Json.parse (). Json.
Stringify() solo puede manejar estructuras de datos que pueden representarse mediante JSON, como números, cadenas y matrices, por lo que las funciones que no pueden representarse mediante JSON no se procesarán correctamente.
Como se puede ver en el ejemplo anterior, después de usar JSON.parse() y JSON.stringify(), el atributo hello se pierde porque es un tipo de función.
Por lo tanto, JSON.parse() y JSON.stringify() aún deben usarse con precaución.