深拷贝 与浅拷贝理解与实现

Posted 388ximengpy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝 与浅拷贝理解与实现相关的知识,希望对你有一定的参考价值。

在js中对象与数组之间的拷贝分为深拷贝与浅拷贝,浅拷贝即是单层的拷贝,将一个对象或者数组拷贝到另一个变量中,此时都指向同一个数组,话不多说,我们来看例子:

 let obj1 = {a:3,b:4,z:{x:5,t:6}} 
// 将此对象赋值给另一个对象,浅拷贝的方法实现

 

 let obj2 = Object.assign({},obj1)   //assign实现浅拷贝
  let obj3 = {...obj1}//ES6解构赋值实现浅拷贝
 function copy(obj){
   if(obj == null) return 
   let type = obj.toString().slice(8,-1)
   let result =(type == "Object")? {}: []
   for(let i in obj){
    result[i] = obj[i]
   }
  return result
}
 let obj4 = copy(obj1)
//用for...in 的方法实现浅拷贝

以上3种方法都可实现浅拷贝

obj1,obj2.obj3,obj4,当我给其中一个对象里面的对象赋值的时候,其他的对应的值也会改变

技术图片

结果如上

以上是浅拷贝,下面介绍深拷贝。

深拷贝就是不管对象或者数组下面有多少个对象或者数组都可以复制到另一个变量中去

我用了两种方法实现

 function truedeep(obj) {

      let type = obj.toString().slice(8, -1)  //用toString方法判断obj的
//类型。
      let result = (type == "Object") ? {} : []  
      if (type != "Object" && type != "Array") return obj
      if (type == "Array") {
        for (let i = 0; i < obj.length; i++) {
          result.push(truedeep(obj[i]))   //用递归逐层剖开
        }
      } else {
        for (i in obj) {
          result[i] = truedeep(obj[i])
        }
      }
      return result
    }


    let obj5 = truedeep(obj1)
    let obj6 = JSON.parse(JSON.stringify(obj1))
//用JSON的方法实现深拷贝

同样的测试,效果如图

技术图片

可见深拷贝是完完全全把一个对象拷贝到另一个对象,且从此两者都没有多大关系了。

以上是关于深拷贝 与浅拷贝理解与实现的主要内容,如果未能解决你的问题,请参考以下文章

深拷贝与浅拷贝的区别,实现深拷贝的几种方法

JS深拷贝与浅拷贝的区别,实现深拷贝的几种方法

Java 深拷贝与浅拷贝概念与代码实现

Java轻松理解深拷贝与浅拷贝

通过项目实战学习:深拷贝与浅拷贝的内涵,实现深拷贝的几种方法,深拷贝解决项目异常bug

关于Python中深拷贝与浅拷贝的理解---概念