美文网首页
一、对象的深拷贝和浅拷贝

一、对象的深拷贝和浅拷贝

作者: 雪燃归来 | 来源:发表于2020-04-17 19:14 被阅读0次

     javascript 有8中数据类型,undefined、number、boolean、object、symbol、BigInt、String、Null,他们可以被分为两大类——原始类型引用类型
    其中,原始数据类型存放在中,引用数据类型是存放在中的。堆中的数据是通过引用和变量关联起来的。也就是,javascript的变量是没有数据类型的,值才有数据类型,变量可以随时持有任何类型数据。
    在JavaScript中将一个原始数据类型的变量a赋值给b,那么a和b会相互独立、互不影响;但是将引用类型的变量a赋值给变量b,那么导致a、b两个变量都同时指向对中的同一块数据。

JavaScript中对象的深拷贝和浅拷贝

let jack = { name : "jack.ma",
     age:40,
           like:{
               dog:{ color:'black', age:3, },
               cat:{ color:'white', age:2 } 
           }
      }
    function copy(src){ 
            let dest
            return dest
    }
   let jack2 = copy(jack)
   jack2.age = 50
   jack2.like = {
      spork:{color:'purple',age:5}
   }
  console.log(jack.age)
  console.log(jack.like)

方法一、使用JSON.parse和JSON.stringfy

可以通过JSON.string将复杂的对象数据类型转化为简单的字符串类型,然后再进行复制的时候,就是复制字符串的过程,就不存在对象拷贝不完成的情形。具体代码如下。

function copy(src){ 
       let dest
       dest = JSON.parse(JSON.stringify(src))
      return dest
}

\color{red}{注意}:这种方法不能拷贝函数。

方法二、使用es6的Object.assign(target,source1,source2)

Object.assign()这个方法将源对象(source)的所有可枚举的属性复制到目标属性

function copy(src){ 
            let dest
            dest = Object.assign({}, src)
            return dest
        }

\color{red}{注意}:只能拷贝一层。

方法三、自定义方法(使用递归的方法)

function copy(src){ 
    let dest
    if(typeof src !== 'object'){
         return
    }
     dest = src instanceof Array ? [] : {}
     for(let key of Object.keys(src)){
           dest[key] = typeof src[key] === 'object' ? copy(src[key]) : src[key]
      }
     return dest
 }

\color{red}{注意}:这种通过递归的方法可以遍历多层对象。
也可以使用下面的这种形式

function copy(src){ 
            if(typeof src === 'object'){
                if(!src) return 
                var dest = src.constructor()
                for(var key in src){
                    dest[key] = typeof dest[key] === 'object' ? copy(src[key]) :  src[key]
                }
                return dest
            } else {
                return src
            }
        }

其中var dest = src.constructor()比较重要,当src为数组时,dest就是数组;当src为对象时,dest就是对象。

相关文章

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • day9-函数基础

    一、浅拷贝和深拷贝 import copycopy.copy(对象):浅拷贝copy.deepcopy(对象):深...

  • day 9

    浅拷贝和深拷贝 copy.copy(对象):浅拷贝 copy.deepcopy(对象):深拷贝 copy.copy...

  • 浅拷贝和深拷贝与(基本复杂类型)数组去重

    对象浅拷贝和深拷贝 //浅拷贝 //深拷贝 所有继承了 Object 的对象都会继承到 hasOwnPropert...

  • 五、面试总结(五)

    对象 拷贝(clone) 如何实现对象克隆 深拷贝和浅拷贝区别 深拷贝和浅拷贝如何实现激活机制 写clone()方...

  • js中的深拷贝和浅拷贝

    一、深拷贝与浅拷贝 深拷贝和浅拷贝只针对Object,Array这些复杂的引用对象。浅拷贝,只复制对象的引用的地址...

  • iOS 中 load 和 initialize 方法调用机制

    深拷贝和浅拷贝 深拷贝同浅拷贝的区别:浅拷贝是指针拷贝,对一个对象进行浅拷贝,相当于对指向对象的指针进行复制,产生...

  • Cloneable 接口

    浅拷贝(shallow clone)和深拷贝(deep clone) 浅拷贝是指拷贝对象时仅仅拷贝对象本身和对象中...

网友评论

      本文标题:一、对象的深拷贝和浅拷贝

      本文链接:https://www.haomeiwen.com/subject/beqyvhtx.html