Copia profunda y copia superficial - M

copia profunda y copia superficial

Los tipos de datos se dividen en: tipos de datos básicos y tipos de referencia

En primer lugar, los tipos de datos básicos se dividen en siete categorías: número, cadena, booleano, nulo, indefinido, símbolo y el nuevo BigInt (entero de precisión arbitraria) agregado por ES10 en el futuro.
Los tipos de referencia se dividen en Array, Object, Function, Regular, etc.

Cómo los dos tipos de datos almacenan datos

tipo de datos básicos

Para los tipos de datos básicos, tanto los nombres como los valores se almacenan en la memoria de pila. Por ejemplo, sea a = 1, entonces el nombre a y el valor b se almacenan en la memoria de pila.Si b=a, cuando a se copia en b, se abrirá una nueva memoria en la memoria de pila, de modo que a y b no se afectan entre sí Cuando a Cuando se cambia el valor de, b no se verá afectado. No existe tal cosa como copia profunda o copia superficial para tipos de datos básicos. Esta declaración solo existe para datos de referencia.
inserte la descripción de la imagen aquí

tipo de referencia

Tipo de datos de referencia, el nombre se almacena en la memoria de pila y el valor se almacena en la memoria de pila, pero la memoria de pila proporcionará una dirección de referencia que apunta al valor en la memoria de pila. Cuando b=a, cuando a se copia en b, en realidad se copia la dirección de referencia de a, no el valor en el montón. Al cambiar el valor de a, dado que a y b apuntan a la misma dirección, b naturalmente se verá afectado, que es una copia superficial. Entonces, si también se abre una nueva memoria en la memoria del montón para almacenar el valor de b, entonces se puede lograr el efecto de copia profunda.
inserte la descripción de la imagen aquí

Cómo implementar una copia profunda

1. Realizar copia profunda por recursividad

Atravesar objetos y matrices hasta que contengan tipos de datos básicos, y luego copiarlos es una copia profunda.

function deepClone(obj) {
    
    
    var target = {
    
    };
    for (var key in obj) {
    
    
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
    
    
            if (typeof obj[key] === 'object') {
    
    
                target[key] = deepClone(obj[key]);
            } else {
    
    
                target[key] = obj[key];
            }
        }
    }
    return target;
}

2、JSON.parse(JSON.stringify(obj))

Use JSON.stringify para convertir el objeto en una cadena JSON, y luego use JSON.parse() para analizar la cadena en un objeto. Después de ir y regresar, se genera un nuevo objeto y el objeto abrirá una nueva pila para lograr copia profunda. Solo puede implementar una copia profunda de matrices u objetos, pero no puede manejar funciones.

let obj = {
    
    
    id: 1,
    name: '张三',
    age: 10,
}
let newObj = JSON.parse(JSON.stringify(obj))

3. El método de extensión de jQuery realiza una copia profunda

var array = [1,2,3,4];
var newArray = $.extend(true,[],array); // true为深拷贝,false为浅拷贝

Cómo implementar una copia superficial

1, Objeto.asignar()

El método Object.assign() se usa para copiar los valores de todas las propiedades enumerables de uno o más objetos de origen a un objeto de destino. Devolverá el objeto de destino.

Object.assign(target, ...sources)
arget--->目标对象
source--->源对象
返回值:target,即目标对象

Solo el atributo de primer nivel es una copia profunda y el atributo de segundo nivel es una copia superficial
Copia superficial:

//如果只是想将两个或多个对象的属性合并到一起,不改变原有对象的属性,可以用一个空的对象作为target对象。
var target={
    
    name:'guxin',age:25};
var source={
    
    state:'single'}
var result=Object.assign({
    
    },target,source);
console.log(result)//{name: 'guxin', age: 25, state: 'single'}

Copia profunda:

var obj = {
    
     a: {
    
    a: "kobe", b: 39} };
var initalObj = Object.assign({
    
    }, obj);
initalObj.a.a = "wade";
console.log(obj.a.a); 

El atributo de estado en el origen se puede fusionar con el objeto de destino (si hay un atributo con el mismo nombre, el valor del atributo posterior anulará el valor del atributo anterior):

var target={
    
    name:'guxin',age:25};
var source={
    
    state:'single'}
var result=Object.assign(target,source);
console.log(target,target==result);//{name: 'guxin', age: 25, state: 'single'} true

2. Operador de extensión

Solo el atributo de primer nivel es una copia profunda y el atributo de segundo nivel es una copia superficial
.

var obj = {
    
    a: 1,b: 2}
var obj1 = {
    
    …obj} //深拷贝

3. Las matrices usan métodos de matriz (concat, slice)

Solo el atributo de primer nivel es una copia profunda y el atributo de segundo nivel es una copia superficial
.

var arr1 = [1, 2, 3, 4]
var arr2 = arr1.concat()
var arr3 = arr1.slice(1)

copia superficial:

let arr = [1, 3, {
    
    username: 'kobe' }];
let arr2=arr.concat();    
arr2[2].username = 'wade';
console.log(arr);
let arr = [1, 3, {
    
    username: 'kobe' }];
let arr3 = arr.slice();
arr3[2].username = 'wade'
console.log(arr);

Los métodos slice y concat de Array no modifican la matriz original, pero devuelven una nueva matriz que es una copia superficial de los elementos de la matriz original. como:

let arr = [1, 3, {
    
        username: ' kobe'    }];
let arr3 = arr.slice();
arr3[1] = 2
console.log(arr,arr3);

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/Sunshinedada/article/details/130751257
Recomendado
Clasificación