浅拷贝只拷贝了最外层,对于更深层次只拷贝引用(即只拷贝数据地址,如果对数据进行更改则会互相影响)
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) // 我是被修改之前的元素