Escritura a mano con copia profunda y comprensión profunda de la copia

Escritura a mano con copia profunda y comprensión profunda de la copia

Prefacio

  1. La relación entre copia superficial y copia profunda
  2. ¿Por qué utilizar la copia profunda y qué hace la copia profunda?

Copia superficial

Correspondiente a copia profunda es copia superficial, copia superficial es asignación directa; en muchos casos, necesitamos asignar un valor a una variable y asignar un valor a una dirección de memoria, pero al asignar un tipo de referencia, solo compartimos un área de memoria, lo que lleva a la asignación. En ese momento, todavía es consistente con el valor anterior.

	var text1 = {
    
    
        a:1,
        b:2
    }
    var text2 = text1
    text2.a = 2

    console.log(text1.a) // 2
    console.log(text2.a) // 2

Al igual que en el código anterior, puede asignar directamente text1 a text2. Siempre que cambie el valor de text2, el valor de text1 también cambiará. Luego, debemos usar nuestra copia profunda. La copia profunda es para crear un nuevo montón espacio de memoria para la variable. Utilice la recursividad para asignar datos pasados.

texto

Para utilizar la copia profunda, primero debe determinar el tipo de datos y asegurarse de que sea un tipo de referencia, porque el tipo de datos no es obligatorio.

var obj = {
    
    
    name: '三石',
    age: '20',
    loveColor: 'black',
    hobby: {
    
    
      game: 'LOL',
      movement: 'running'
    },
    game:['CF',"CS"]
  }
  
  var newObj = deepClone(obj)
  newObj.wocao[0]= "哈哈哈"
  console.log(obj)
  console.log(newObj)

	//深拷贝
  function deepClone(obj) {
    
    
    // 判断obj是不是个对象或者是不是undefined 
    //如果obj不是个对象或者是 undefined 或 null 直接进行 return
    if (typeof obj !== 'object' || obj == null) {
    
    
      return obj
    }
    // 初始化一个变量返回结果
    let result
    // 判断obj的类型  然后给result一个一样的数据类型额
    if (obj instanceof Array) {
    
    
      result = []
    } else {
    
    
      result = {
    
    }
    }
    // 利用for in 遍历obj
    for (let key in obj) {
    
    
      if (obj.hasOwnProperty(key)) {
    
    
      // 下面这个判断可加可不加 看情况  如果死循环的话就加上
        	 // 判断obj【key】是否存在  并且还是引用类型
        if(obj[key] && typeof obj[key] === 'object'){
    
    
          result[key] = deepClone(obj[key])
        }else{
    
    
          result[key] = obj[key]
        }
      }
    }
    return result
  }

Resumen
Esta es solo la escritura de copia profunda de es5, es6 es algo diferente de esto, y esto es solo la escritura recursiva en copia profunda .

Supongo que te gusta

Origin blog.csdn.net/weixin_55869763/article/details/115355518
Recomendado
Clasificación