小菜鳥變大笨鳥-對象深拷貝

一 直接使用JSON.stringfy()和JSON.parse()

缺陷:當對象中有undefined和function和symbol時會被自動忽略jquery

例如:測試

var syb = Symbol('obj');
    var person = {
      name: 'tino',
      say: function () {
        console.log('hi');
      },
      ok: syb,
      un: undefined
    }
    var copy = JSON.parse(JSON.stringify(person))
    console.log(copy);//{name: "tino"}

因此當你遇到這種狀況時,能夠本身寫一個遞歸來進行深拷貝code

二 遞歸深拷貝

function deepCopy(obj) {
      var result = Array.isArray(obj) ? [] : {};
      for (var key in obj) {
        if (typeof (obj[key]) === "object" && obj[key] !== null) {
          result[key] = deepCopy(obj[key]);
        } else {
          result[key] = obj[key];
        }
      }
      return result;
    }

測試:對象

var personCopy = deepCopy(person);
    console.log(personCopy);//{name: "tino", ok: Symbol(obj), un: undefined, say: ƒ}
    personCopy.test = "hahahha";
    console.log(personCopy);//{name: "tino", ok: Symbol(obj), un: undefined, test: "hahahha", say: ƒ}
    console.log(person); //{name: "tino", ok: Symbol(obj), un: undefined, say: ƒ}
    var arr = [1, 2, 3, 4, 5, 6];
    var arr1 = deepCopy(arr);
    console.log(arr1); //[1, 2, 3, 4, 5, 6]
    arr1.push(7);
    console.log(arr1); //[1, 2, 3, 4, 5, 6, 7]
    console.log(arr); //[1, 2, 3, 4, 5, 6]

也可使用jQuery的extend來進行對象深拷貝,缺陷,當屬性值爲undefined的時候會被直接忽略
例如:遞歸

// jquery 的extend,當屬性值爲undefined時會被直接忽略
    var person3 = $.extend({}, person);
    console.log(person3);//{name: "tino", ok: Symbol(obj), say: ƒ}
相關文章
相關標籤/搜索