Libertus Chen-U
  1. 1 Libertus Chen-U
  2. 2 Warcry mpi
  3. 3 Life Will Change Lyn
  4. 4 Quiet Storm Lyn
  5. 5 Time Bomb Veela
  6. 6 Hypocrite Nush
  7. 7 One Last You Jen Bird
  8. 8 かかってこいよ NakamuraEmi
  9. 9 Last Surprise Lyn
  10. 10 Flower Of Life 发热巫女
  11. 11 The Night We Stood Lyn
2017-05-14 22:47:07

在JS中实现对象拷贝的思路

在JS中对象拷贝的场景比较常见。由于对象属性中可能存在引用类型,一般分为浅拷贝和深拷贝两种。这里总结一下常见思路,可以根据具体需求复杂度进一步完善。


浅拷贝

ES6的Object.assign方法

let copy = Object.assign({}, obj)

遍历复制

function shadowCopy(obj) {
  if (!obj && typeof obj !== 'object') {
    return;
  }
  let newObj = obj.constructor === ‘Array’ ? [] : {};
  for (let prop in obj) {
    if (obj.hasOwnProperty(prop)) {
      newObj[prop] = src[prop];
    }
  }
  return newObj;
}

深拷贝

JSON序列化方法

let copy = JSON.parse(JSON.stringify(obj))

该方法只能满足简单的情况,因为序列化JS对象时,只能处理能被json直接表示的数据结构。

递归复制

let copy = function(obj) {
  if (!obj && typeof obj !== 'object') {
    return;
  } 
  let newobj = obj.constructor === Array ? {} : []; 
  for (let i in obj) {
    if (obj.hasOwnProperty(i)) {
    newobj[i] = typeof obj[i] === 'object' ? copy(obj[i]) : obj[i];
  }
  return newobj;
}

可能存在循环引用的问题,可以根据具体需求选择抛出错误或是跳过当次循环。

-- EOF --

添加在分类「 前端开发 」下,并被添加 「JavaScript」 标签。