深拷贝与浅拷贝


深浅拷贝指的是拷贝内容。深拷贝就是在堆内存中完全开辟一份新的空间存储被拷贝的内容;浅拷贝只拷贝了一层,对象数组的拷贝方法就属于浅拷贝。

1. 常见的浅拷贝

(1) 数组api:

Array.prototype.concat() 

Array.prototype.slice() 

Array.prototype.from() 

(2) 对象api:

Object.assign(obj1,obj2);
Object.getOwnPropertyNames(obj);
Object.keys(obj);

(3) rest运算符:

[...list] {...list} 

2. 深拷贝

(1) JSON.parse(JSON.Stringfy())

如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失。如果操作对象有循环属性会报错。

基于各种各样的问题,往往需要手写一个递归函数处理,判断各种情况。

(2) 递归函数

  // 1. 封装一个函数,实现传入一个对象返回一个拷贝后的新对象
function cloneObj(obj) {
  // 根据不同类型设置不同的初始化
  if (obj instanceof Array) {
    var clone = [];
  } else {
    var clone = {};
  }

  //使用for...in
  for (let i in obj) {
    // 如果为对象则递归更进一层去拷贝
    if (typeof obj[i] == "object" && obj[i] != null) {
      clone[i] = cloneObj(obj[i]);
    } else {
    // 否则存进变量
      clone[i] = obj[i];
    }
  }

  //循环结束后输出
  return clone;
}

文章作者: iamfugui
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 iamfugui !
评论
  目录