深拷贝/浅拷贝

Posted 纸 飞机

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深拷贝/浅拷贝相关的知识,希望对你有一定的参考价值。

浅拷贝:将原对象或原数组的引用直接赋 给新对象,新数组。新对象/数组只是原对象的一个引用。只是增加了一个指针指向已存在的内存地址。

深拷贝:创建一个新的对象和数组,将原 对象的各项属性的“值”(数组的所有元 素 ) 拷 贝 过 来 , 是 “ 值 ” 而 不 是 “ 引 用”。是增加了一个指针并且申请了一个 新的内存,使这个增加的指针指向这个新 的内存。

注意:像“深”拷贝第一层级的对象属性或数组元素,也是浅拷贝。真正深拷贝是拷贝多层,每一级别的数据都会拷贝出来,之后就会完全独立,更改原对象,拷贝对象不会发生变化。

浅拷贝

//拷贝一层,对象是拷贝的引用类型,其他都是直接将值传递
function simpleClone(initalObj) {
    var obj = {};
    for (var i in initalObj) {
        obj[i] = initalObj[i];
    }
    return obj;
}

Object.assign()方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。是浅拷贝。 

Object.assign(target, ...sources)

深拷贝

//用JSON.stringify把对象转成字符串,再用JSON. parse把字符串转成新的对象。
var objl = {body: {a: 10}};
var obj2 = JSON.parse(JSON.stringfy(obj1));

递归实现拷贝

function deepClone(obj){
  let objClone =  Array.isArray(obj) ? [] : {};
  if (obj && typeof obj === 'object') {
    for(let key in obj){
      if (obj[key] && typeof obj[key] === 'object'){
        objClone[key] = deepClone(obj[key]);
      }else{
        objClone[key] = obj[key]
      }
    }
  }
  return objClone;
}

以上是关于深拷贝/浅拷贝的主要内容,如果未能解决你的问题,请参考以下文章

代码学习PYTHON 深拷贝和浅拷贝

jquery怎样深拷贝一个数组

Python高级详解 深拷贝和浅拷贝

Python高级详解 深拷贝和浅拷贝

深拷贝-浅拷贝

iOS开发——深拷贝与浅拷贝详解