JS深浅拷贝

javaScritp的数据类型按存储方式,分为基本数据类型引用数据类型。基本数据类型保存在栈内存,引用类型保存在堆内存中。保存在栈内存是大小固定的数据,而引用类型的大小不固定,只能保存在堆内存中,可是它的地址写在栈内存中能够供咱们访问。
  基本数据类型是按值访问,操做的就是变量保存的值;对于引用类型,咱们只是经过保存在变量中的引用类型的地址来操做实际对象。因此基本数据类型的复制能够经过简单的赋值来进行,而引用数据类型复制的则是其地址。所以对引用类型数据,分为深拷贝浅拷贝。浅拷贝只复制指向某个对象的指针,而不复制对象自己,新旧对象仍是共享同一块内存。但深拷贝会另外创造一个如出一辙的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。java

//深浅拷贝函数实现
function extend(obj1, deep){
    //deep为true,则递归调用extend函数进行深拷贝
    var obj = (obj1 instanceof Array ? [] : {})
    for(var key in obj1){
        var value = obj1[key]
        obj[key] = (!!deep && value !== null && typeof value === "object") ? extend(value, deep) : value
    }
    return obj
}

 var obj = {
          a: "hello",
          b:{
              a: "world",
              b: 21
            },
          c:["Bob", "Tom", "Jenny"],
          d:function() {
              alert("hello world");
            }
        }
 var objCopy = extend(obj, true)
JSON.parse(JSON.stringify(obj))
//利用JSON的序列化和反序列化,没法对函数类型进行拷贝;
//undefined、function、symbol 会在转换过程当中被忽略

另外concat和slice两个数组方法均可以返回一个修改后的新数组,能够对单层的数组进行拷贝;Object.assign()和... 展开运算符也相似。
相关文章
相关标签/搜索