美文网首页
deepClone & shadowClone

deepClone & shadowClone

作者: 菜鸡前端 | 来源:发表于2021-09-10 21:40 被阅读0次

shadowClone & deepClone,对于 Symbol 类型的 key,它是无法通过 for ...in... 遍历的,需要通过专有API Object.getOwnPropertySymbols(obj) 去获取。

1. shadowClone

// 只考虑 source 为 Array 或者 Object
function shadowClone(source) {
  var target;
  if (Array.isArray(source)) {
    target = [] 
  } else {
    target = {}
  }
  for(let key in source) {
    if (source.hasOwnProperty(key)) {
      target[key] = source[key]
    }
  }
  return target;
}

// 用例
var source = { name: 1, person: { name: 2 }}
var res = shadowClone(source);
console.log(res.person === source.person) // true
// 只考虑 source 为 Array 或者 Object
function shadowClone(source, target) {
  for(let key in source) {
    if (source.hasOwnProperty(key)) {
      target[key] = source[key]
    }
  }
}

// 用例
var source = { name: 1, person: { name: 2 }}
var target = {}
shadowClone(source, target);
console.log(target.person === source.person) // true

2. deepClone

function deepClone(obj, hash = new WeakMap()) {
  if (obj instanceof Date) return new Date(obj);
  if (obj instanceof RegExp) return new RegExp(obj);
  if (obj === null || typeof obj !== 'object') return obj;

  // 循环引用的情况
  if (hash.has(obj)) {
    return hash.get(obj)
  }

  let result = new obj.constructor();
  hash.set(obj, result);

  for (let key in obj) {
    if (obj.hasOwnProperty(key)) {
      result[key] = deepClone(obj[key], hash)
    }
  }

  let symbols = Object.getOwnPropertySymbols(obj)
  for (let i = 0; i < symbols.length; i++) {
    if (obj.hasOwnProperty(symbols[i])) {
      result[symbols[i]] = deepClone(obj[symbols[i]], hash)
    }
  }

  return result
}

// 测试用例
var wife = {
  name: 'age',
  age: 25,
  [Symbol()]: 222,
  children: [
    {
      name: 'name',
      age: 26,
    }
  ]
}
wife.self = wife;
var target = deepClone(wife);
console.log(target)

相关文章

网友评论

      本文标题:deepClone & shadowClone

      本文链接:https://www.haomeiwen.com/subject/lnwnwltx.html