您的位置:首页 > 移动开发 > Objective-C

js对象深度拷贝、Object.assign()、Object.assign()复制非对象、Object.assign()浅拷贝

2018-03-11 14:30 816 查看
把对象target1,target2,...合并到对象origin上
Object.assign(origin,target1,target2,....);
例1:合并的是对象
  var origin = {
      a:'a'
  },
  target1 = {
      b:'b'
  },
  target2 = {
      c:'c'
  }
  Object.assign(origin,target1,target2);
  origin改变
  console.log(origin) // {a:'a',b:'b',c:'c'}
例2: 合并的值是 数字、控制符串 ''、布尔值(false或true)、undefined、null
  var origin = {a:'a'},
      target1 = 1;
  Object.assign(origin,target1);
  origin不改变:
  console.log(origin) // {a:'a'}
例3: 合并的是数组
  var origin = {a:'a'},
      target1 = [12,123];
  Object.assign(origin,target1)
  target1会被以 索引为属性,值为属性值复制到origin
  console.log(origin) // {0:12,1:123,a:'a'}

  如果原对象有0,1之类的属性会被替换值
  var origin = {0:0,a:'a'},
      target1 = [12,123];
  Object.assign(origin,target1)
  console.log(origin) // {0:12,1:123,a:'a'}

例4:合并的是非空字符串
  var origin = {a:'a'},
      target1 = 'nihao啊';
  Object.assign(origin,target1);
  字符串会被以索引为属性,值为属性值复制到origin
  console.log(origin) // {0:'n',1:'i',2:'h',3:'a',4:'o',5:'啊',a:'a'}
以上只有一层值的时候拷贝是没问题的,即拷贝之后,origin和target1的值再改变时是不会相互影响的

例5:拷贝的对象有两层及以上的时候,拷贝之后会相互影响,target1改变 origin也会跟着改变
  var origin = {a:'a'},
      target1 = {
        b:{c:1}
      };
  Object.assign(origin,target1);
  console.log(origin) // {a:'a',b:{c:1}}
  target1.b.c++
  console.log(origin) // {a:'a',b:{c:2}}
  target1改变 origin也改变了。
综上Object.assign()是浅拷贝
// 深度拷贝 function deepClone(origin, target) { var target = target || {}; for (var prop in origin) {
if (origin.hasOwnProperty(prop)) { if (origin[prop] !== null && typeof origin[prop] === 'object') { target[prop] = Object.prototype.toString.call(origin[prop]) === '[object Array]'? [] : {}; deepClone(origin[prop], target[prop]); } else { target[prop] = origin[prop] } } }
} var obj = { name: 'name', arr: [1, 2, 3], obj: { a: 'a' }, f: function () {
} } var obj1 = {}; deepClone(obj, obj1) console.log(obj1)    /*
    {
      name: 'name',
      arr: [1, 2, 3],
      obj: { a: 'a' },
      f: function () {

      }
    }
    */
    obj.obj.a = 'b';    console.log(obj1)
/*
    {
      name: 'name',
      arr: [1, 2, 3],
      obj: { a: 'a' },
      f: function () {

      }
    }
  obj1不会跟随obj改变
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息