浅拷贝:

  1. 自己实现: ```javascript const checkoutType = (target) => Object.prototype.toString.call(target).slice(8, -1);

const shallowClone = (target) => { let result; if(checkoutType(target) === ‘Object’) { result = {}; } if(checkoutType(target) === ‘Arrary’) { result = []; } Object.keys.forEach((key) => { if(Object.protrotype.hasOwnProperty.call(target, key)) { result[key] = target[key]; } }) return result; }

  1. 2. Object.assign:
  2. ```javascript
  3. const obj = {
  4. name: '测试1',
  5. age: 12,
  6. }
  7. const copyObj = Object.assign({}, obj);
  1. 数组api:
    Array.prototype.concat(target) || Array.prototype.slice(start, end) || … (三点运算符)。

小知识:
Reflect.ownKeys() 获取对象的key 包括Symbol 相当于Object.getOwnPropertyNames(target) concat(Object.getOwnPropertySymbols(target)。

深拷贝:

1.手写

const isObj = (target) => {
  return typeof(target) === 'Object' && target != null;
}

const deepClone1 = (target, hash = new WeakMap()) => {
  if(!isObj) return target;
  if (checkoutType(target) === 'Array') {
    result = [];
  } else if (checkoutType(target) === 'Object'){
    result = {};
  }
  if (hash.has(target)) return hash.get(target);
  hash.set(target, result);
  Reflect.ownKeys(target).forEach((key) => {
    if(isObj(target[key])) {
      result[key] = deepClone1(target[key], hash);
    } else {
        result[key] = target[key]
    }
  })
  return result;
}
  1. Json.parse(Json.stringify(target));
    不能存放函数和underfined;
    不要存放时间对象,否则会变成字符串形式;
    不能存放 RegExp、Error 对象,否则会变成空对象;
    不能存放 NaN、Infinity、-Infinity,否则会变成 null;