浅拷贝

这里不再讨论循环遍历的方式

1. … 操作符

  1. let obj = {a: 1, b: 2};
  2. let clone = {...obj};

2. Object.assign

  1. let obj = {a: 1, b: 2};
  2. let clone = Object.assign({}, obj);

深拷贝

1. JSON.stringify 和 JSON.parse

  1. let obj = {a: 1, b: 2};
  2. let clone = JSON.parse(JSON.stringify(obj));

这个方法最简洁也最常用,但是它也并不是完全通用的,也有需要注意的地方:

  • 不支持值为函数

2. 递归实现

简单实现:

  1. function clone(origin) {
  2. let newObj = {};
  3. for (let key in origin) {
  4. if (typeof origin[key] === 'object') {
  5. newObj[key] = clone(origin[key]);
  6. } else {
  7. newObj[key] = origin[key];
  8. }
  9. }
  10. return newObj;
  11. }

还需要考虑 数组 等其他引用类型的拷贝