深浅拷贝区别

浅拷贝只复制第一层可枚举的属性值,深拷贝对每一层里的可枚举的属性值都进行复制。

  • 简单实现浅拷贝

function copy (source) {
  if (source === null || typeof source !== 'object') return source;
  const copy = Array.isArray(source) ? [] : {};

Object.keys(source).forEach(key => { copy[key] = source[key] }) return copy }

浅拷贝的实现有

  • Object.assign
  • ...展开语法
  • Array.prototype.slice()
  • 数组的concat
  • 简单实现深拷贝

function deepCopy (source) {
  if (source === null || typeof source !== 'object') return source;
  const copy = Array.isArray(source) ? [] : {};

Object.keys(source).forEach(key => { copy[key] = deepCopy(source[key]) }) return copy }

JSON.parse(JSON.stringify(source)) 是对深拷贝的实现

但存在如下问题:

  • 拷贝JSON中不支持的类型会有问题,如Date类型拷贝时,会转化为带T格式的日期字符串