js深拷贝和浅拷贝

深拷贝,创建一个新的数组或对象,它的各级键值从原对象(数组)复制了一 份(就是引用地址复制了一份,值也复制了,这两个栈内存中的地址指向各自的堆内存中的值)

浅拷贝,就是把原对象(数组)的引用地址赋给了新对象,新对象和原对象的地址指向的是同一个堆存储地址

 

深拷贝分两种:

1.  只对第一层级拷贝 (第一层级的元素值都是基本数据类型的)

     方法:

           a. 遍历赋值(对象/数组)

           b. 针对数组  newArr=oldArr.slice()    当slice不带任何参数时,默认返回一个和原数组完全相同的新数组

                                newArr=oldArr.concat()  相当于合并原数组和一个空数组并返回

           c.针对对象   用ES6的Object.assign,对象的合并: newObj=Object.assign({ }, oldObj)

 将源对象(第二个起的参数oldObj)的所有可枚举属性复制到目标对象(第一个参数{}),并返回合并后的目标对象(newObj)

           d. ES6的扩展运算符(...)   newObj={ ...oldObj }     newArr={ ...oldArr }

2.  拷贝所有层级(多层嵌套对象或数组)

          a.  newObj = JSON.parse(JSON.stringify(oldObj) )

               newArr = JSON.parse(JSON.stringify(oldArr)  )

           b. 手动写递归

                function  deepClone(oldObj){

                     var newObj = oldObj.constructor===Array? [] :{}

                      if( typeof oldObj !=='object') return

                    for (var  key in oldObj ){

                      newObj[key] = typeof oldObj[key] ==='object' ? deepClone(oldObj[key]) : oldObj[key]           

                    }

                    return newObj

              }

      c. 用juqery中的extend方法  $.extend([deep], target, oldObj1[,oldObjN])

          deep表示是否深拷贝,true(深拷贝)/false(浅拷贝)

          target 目标对象  ,其他对象的成员属性将被附加到该对象上

          oldObj1  oldObjN第一个及第N个被合并的对象

          newObj = $.extend( true, {}, oldObj)


                               

 

 

 

你可能感兴趣的:(js深拷贝和浅拷贝)