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()和... 展開運算符也相似。
相關文章
相關標籤/搜索