小菜鸟变大笨鸟-对象深拷贝

一 直接使用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: ƒ}
相关文章
相关标签/搜索