深拷贝和浅拷贝

深拷贝:
将一个对象或数组完完全全的复制过来,变成了另一个新的对象或数组,当原有的对象或数组改变时,现有的对象或数组不会改变

浅拷贝:
将一个对象或数组的值引用给另一个对象或数组,只是值的引用,当原有的对象或数组改变时,现有的对象或数组也会发生改变

深拷贝的方法:

(不适用对象里面包含函数)

var obj = {
    name: 'guo'
}
var objTwo = JSON.parse(JSON.stringify(obj))
objTwo.name = 'guochenyu'
 
console.log('obj:', obj)   // obj: {name: "guo"}
console.log('objTwo', objTwo)   // objTwo: {name: "guochenyu"}

(对象嵌套过深的话,会对性能有一定的消耗)

function deepCopy(obj) {
  var newobj = obj.constructor === Array ? [] : {};
  if (typeof obj !== 'object') {
    return obj;
  } else {
  for (var i in obj) {
    if (typeof obj[i] === 'object'){ //判断对象的这条属性是否为对象
      newobj[i] = deepCopy(obj[i]);  //若是对象进行嵌套调用
    }else{
        newobj[i] = obj[i];
        }
    }
    }
    return newobj; //返回深度克隆后的对象
}
 
var obj1 = {
    name: 'shen',
    show: function (argument) {
        console.log(1)
    }
}
var obj2 = deepCopy(obj1)
console.log('obj1:', obj1)  // obj1: {name: "shen", show: ƒ}
console.log('obj2:', obj2)  // obj2: {name: "shen"}

使用concat合并数组,会返回一个新的数组

浅拷贝:

var obj1 = {
name: 'shen'
}
var obj2 = obj1
obj2.name = 'shenzhiyong'
 
console.log('obj1:', obj1)   // obj1: {name: "shenzhiyong"}
console.log('obj2:', obj2)   // obj2: {name: "shenzhiyong"}
var arr1 = [1,2,3]
var arr2 = arr1
arr2.push(4)
console.log('arr1:', arr1)   // arr1: [1,2,3,4]
console.log('arr2:', arr2)   // arr2: [1,2,3,4]

(Object.assign用于对象的合并等多个用途,其中一个是可以进行浅拷贝)

const obj = {};
const source = {
  name: 'nordon',
  info: {
    age: 18
  }
};

Object.assign(obj, source);
console.log(obj); // {name: 'nordon', info: {…}}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值