javascript深拷贝

Author Avatar
cowboy 8月 30, 2017
  • 在其它设备中阅读本文章

基本类型与引用类型

在JavaScript中,基本类型的是按值复制的,每次复制都是一个副本,各个副本是完全独立的,引用类型的值是按引用复制的,这个值实际上是一个指针,这个指针指向的存储在堆内存中的一个对象,因此无论复制多少份,引用的都是一个对象,更改其中一个所有的引用都会受到影响。

javascript深拷贝.PNG

深拷贝与浅拷贝

深拷贝与浅拷贝都是针对相对于引用类型的说法,浅拷贝即普通的复制操作(常用的“=”复制),复制的是对内存地址的引用即上面介绍的。而深拷贝则是开辟一块新的内存地址,修改一个对象,不会改变另一个对象。深拷贝是复制变量值,遇到非基本类型时,则递归至基本类型后再复制。

实现深拷贝的两个方法

递归

var person = {
      age :  18,
      hobby:  ['basketball','read','travel'],
      job: 'programmer',
    }
    function deepCopy(src,dest){
      var dest = dest || {}  //如果dest为true将dest赋给dest,否则令其为一个空对象
      for(var i in src){
      if(typeof src[i] === 'object'){
                      if(Object.prototype.toString.call(src[i]) === '[object Array]'){
                      //为数组时
                      dest[i] =[]
                    }else{
                      //为对象时
                      dest[i] = {}
                    }
                    //递归
                    deepCopy(src[i],dest[i])
             }else{
               dest[i] = src[i]
             }
         }
         return dest
    }
    var Tom = {name:'Tom'}
    result = deepCopy(person,Tom)
    result.hobby.push("movie")
    console.log(person)
    console.log(result)

结果
javascript深拷贝.PNG

JSON解析

var person = {
      age :  18,
      hobby:  ['basketball','read','travel'],
      job: 'programmer',
    }
 var result = JSON.parse(JSON.stringify(person))
result.hobby.push("movie")
console.log(person)
console.log(result)

结果与上相同, JSON.stringify() 方法把一个JavaScript对象序列化为一个JSON字符串,JSON.parse() 方法将数据转换为 JavaScript 对象。
b = JSON.parse( JSON.stringify(a) )这种方法的局限性在于无法复制函数