浅拷贝与深拷贝的区别

浅拷贝只拷贝了最外层,对于更深层次只拷贝引用(即只拷贝数据地址,如果对数据进行更改则会互相影响)

es5浅拷贝:

var obj = {

name:"我是外部名称",

jineng : {

   name:"我是内部名称"

}

}

var o = {}

o.jineng.name = "我是被修改后的名称"   // 浅拷贝的数据发生改变时,拷贝与被拷贝对象的数据都会发生改变

for(var i in obj) {

o[i] = obj[i]

}

console.log(o.jineng.name)  //我是被修改后的名称

console.log(obj.jineng.name)  // 我是被修改后的名称

在es6中,给浅拷贝提供了语法糖 Object.assign(拷贝的对象,被拷贝的对象) 方法

Object.assign(o, obj) 

深拷贝

深拷贝,相对于浅拷贝,深拷贝要复杂很多,并且没有对应的简便方法,但他能复制更深层的代码,而且对深拷贝的方法进行修改不会影响被拷贝元素,我们可以通过下面代码来验证一下

// 创建一个被复制的元素
var obj = {
  name: "zzz",
  color:["pink", "red"],
  sihay:{
	name:"我是被修改之前的元素"
	}
}
// 创建一个复制的接收元素
var o = {}

// 深拷贝方法
function deepCopy(newobj, oldobj) {
  for(var k in oldobj) {
  var item = oldobj[k];
  // 判断数组的一定要放在最前面,然后判断对象,因为数组也是对象
  if(item instanceof Array) {
   item = oldobj[k];
   deepCopy(newobj, item)
  }else if (item instanceof Object) {
   item = oldobj[k];
   deepCope(newold, item)
  }else{
   newold[k] = item
  }
  }
}
// 调用方法传入实参
deepCopy(o, obj)
console.log(o)
o.sihay.name = "我是被修改之后的元素"

console.log(o.sihay.name) // 我是被修改之后的元素
console.log(obj.sihay.name) // 我是被修改之前的元素
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值