1、浅拷贝复制的是指向对象的指针,并没有开辟新的内存,原对象和新对象共享的是同一块内存,所以修改新对象会影响原对象
2、深拷贝会开辟新的内存地址,原对象和新对象不共享同一内存,修改新对象不会影响到原来对象
(1)深拷贝
var o={
x:1,
y:2,
z:{
z1:3,
z2:4
},
m:[{m1:5},3,5]
}
// 深拷贝 递归方法
function deepClone(newo,old){
for(var k in old){
// 获得属性值
var item=old[k]
if(item instanceof Array){
newo[k]=[]
deepClone(newo[k],item)
}
else if(item instanceof Object){
newo[k]={}
deepClone(newo[k],item)
}
else{
newo[k]=item
}
}
}
var newo1={}
deepClone(newo1,o)
console.log(o)//{x: 1, y: 2, z: {…}, m: Array(3)}
console.log(newo1)//{x: 1, y: 2, z: {…}, m: Array(3)}
//采用JSON的方法
var newo2=JSON.parse(JSON.stringify(o))
console.log(newo2)//{x: 1, y: 2, z: {…}, m: Array(3)}
//jquery中的extend()方法
//引用复制
function shall(obj){
var newobj={}
for(var i in obj){
newobj[i]=obj[i]
}
return newobj
}
var newobj=shall(o)
newobj.y=10
console.log(o)
console.log(newobj)
(2)浅拷贝
Object.assign() 可以把任意源对象的自身可枚举属性拷贝给目标对象,然后返回目标对象
var o={
x:1,
y:2,
z:{
z1:3,
z2:4
},
m:[{m1:5},3,5]
}
//Object.assign()
var newo1=Object.assign({},o)
console.log(newo1)//{x: 1, y: 2, z: {…}, m: Array(3)}
newo1.x=3
newo1.z.z1=5
console.log(newo1)//z1为5 x为3
console.log(o)//z1为5 x为1
//Array.prototype.concat()
var o1=[1,2,3,{x:1,y:2}]
var newo2=o1.concat()
newo2[0]=3
newo2[3].x=5
console.log(newo2)//[1, 2, 3, {…}]
console.log(o1)
//Array.prototype.splice()