duyue6002 / Blog

:pencil2: Write here
http://duyue6002.github.io/Blog/#/
5 stars 1 forks source link

[总结]深拷贝与浅拷贝及其实现 #22

Open duyue6002 opened 5 years ago

duyue6002 commented 5 years ago

duyue6002 commented 5 years ago

实现浅拷贝

function shallowClone(source) {
  if(!source || typeof source !== 'object') {
    throw new Error('error arguments');  
  }
  let target = source instanceof Array ? [] : {};
  for (let key in source) {
    if (source.hasOwnProperty(key)) {
      target[key] = sourse[key];
    }
  }
  return target;
}
duyue6002 commented 5 years ago

实现深拷贝

递归法

function deepClone(source) {
  if (!source || typeof source !== 'object') {
    throw new Error('error arguments');
  }
  let target = source instanceof Array ? [] : {};
  for (let key in source) {
    if (source.hasOwnProperty(key)) {
      // 没有实现对Function/Date的深拷贝,但这类对象重新赋值时不会对源对象产生影响
      if (source[key] && typeof source[key] === 'object') {
        target[key] = deepClone(source[key]);
      } else {
        target[key] = source[key];
      }
    }
  }
  return target;
}

JSON法

JSON.parse(JSON.stringify(obj)),但是所有函数和原型成员会被忽略