JS深浅拷贝

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

//深浅拷贝函数实现
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()和... 展开运算符也类似。

你可能感兴趣的:(javascript)