深拷贝和浅拷贝

80 阅读1分钟

浅拷贝

将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用复杂类型的传址

如果拷贝基础数据类型就直接拷贝

如果拷贝复杂数据类型就是赋值(拷贝后的 会影响拷贝前的值)

深拷贝

创建一个新的对象和数组,将原对象的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”,复制一份完全一致但非同一地址的数据。

浅拷贝方法

  • newObj = Object.assign({},obj)
  • 解构 newObj = {...obj}
  • Array.concat() 数组连接
  • Array.slice() 数组切片

深拷贝方法

  • json.parse、json.stringigy

    对于 undefined任意的函数以及symbol 三个特殊的值分别作为对象属性的值、数组元素、单独的值时 JSON.stringify()将返回不同的结果。

     // 1.作为对象属性的值
     const data = {
         a: "aaa",
         b: undefined,
         c: Symbol("dd"),
         fn: function() {
             return true;
         }
     };
     JSON.stringify(data); // 输出: "{"a":"aaa"}" 
     ​
     // 2.作为数组元素
     JSON.stringify(["aaa", undefined, , Symbol('dd'),function aa() {return true}]) 
     // 输出:"["aaa",null,null,null]"
     ​
     ​
     // 3.作为单独的值
     JSON.stringify(function a (){console.log('a')}) // undefined
     JSON.stringify(undefined) // undefined
     JSON.stringify(Symbol('dd')) // undefined
     ​
    
  • 递归

     function deepClone(obj){
         // Array.isArray(object) 判断是否为数组
         let newObj = Array.isArray(source) ? [] : {}
         
         // for in 遍历数组或对象
         for( let i in obj){
            // 忽略从原型继承的属性,不进行拷贝
             if(obj.hasOwnProperty(i)){
                 const value = obj[i] // 获取值
                 if(value instanceof Array || value instanceof Object){
                     newObj[i] = deepClone(value)
                 }else{
                     newObj[i] = value
                 }
             }
         }
         return newObj
     }