深拷贝与浅拷贝讲解、简单区别

1.深拷贝(Deep Copy):
深拷贝就是增加一个“指针”,并申请一个新的内存,并且让这个新增的‘指针’指向这个新的内存地址,使用深拷贝,在释放内存的时候不会像浅拷贝一样出现重复释放同一段内存的错误,当我们需要复制原对象而又不能修改元素对象的时候,深拷贝就是一个,也是唯一的选择。
下面简单的写一个引用类型数据的深拷贝:

 // 深拷贝引用类型数据
        function deepData(data) {
            if (data.constructor.name === 'Array') { // 为数组
                var arrCopy = []
                for (var i = 0, len = data.length; i < len; i++) {
                    arrCopy.push(data[i])
                }
                return arrCopy;
            } else { // 为对象
                var objCopy = {};
                for (x in data) {
                    objCopy[x] = data[x];
                }
                return objCopy;
            }
        }
        var obj = {
        name : '浅爱',
        age : 21,
        dec : '清风拂过,爱意如仟'
		}
		var res = deepData(obj)
		console.log(res)

2.浅拷贝(Shallow Copy)
简单的来说,浅拷贝就是增加了一个’指针’指向已存在的内存(JavaScript并没有指针的概念,这里只是用于辅助说明),浅拷贝只是拷贝了内存的地址,子类的属性指向的是父类属性的内存地址,当子类的属性修改后,父类的属性也会随之被修改。
浅拷贝小案列:

//此递归方法不包含数组对象
var obj = { a:1, arr: [2,3] };
var shallowObj = shallowCopy(obj);

function shallowCopy(src) {
  var newobj = {};
  for (var prop in src) {
    if (src.hasOwnProperty(prop)) {
      newobj[prop] = src[prop];
    }
  }
  return newobj;
}

两者之间的区别:
一个对象浅复制后,是深层次的对象地址的复制,并没有开辟新的栈,也就是复制的结果是两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会发生改变,而深复制的则是开辟了一个新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。

猜你喜欢

转载自blog.csdn.net/weixin_44260238/article/details/89976915