浅拷贝
浅拷贝只是拷贝一层,更深层次对象级别的只拷贝引用
如下
var obj = {
id:1,
name:'test',
msg:{
age:18
}
var nb = {}
for (var i in obj){
nb[i] = obj[i]
}
console.log(obj)
console.log(nb)
由于是浅拷贝
当我们msg
的时候实际上是拷贝msg
的地址,两个msg指向同一个地址,这样当某个对象对msg
进行修改时,那么另一个对象的msg
也会被修改
var obj = {
id:1,
name:'test',
msg:{
age:14
}
}
var nb = {}
for (var i in obj){
nb[i] = obj[i]
}
nb.msg.age=24
console.log(obj)
console.log(nb)
在es6中通过Object.assign()可实现浅拷贝 第一个参数为拷贝后的对象,第二参数为要拷贝的对象
var obj = {
id:1,
name:'test',
msg:{
age:14
}
}
var nb = {}
Object.assign(nb,obj)
console.log(obj)
console.log(nb)
Array.prototype.concat实现浅拷贝
let arr = [2,3,{user:'hello'}]
let arr2 = arr.concat()
console.log(arr2)
arr2[2].user = 'word'
console.log(arr)//[2,3,{user:'word'}]
Array.prototype.slice实现浅拷贝
let arr = [2,3,{user:'hello'}]
let arr3 = arr.slice()
arr3[2].user = 'word'
console.log(arr)//[2,3,{user:'word'}]
深拷贝实现
var obj = {
id:1,
name:'test',
msg:{
age:14
},
arr:['a']
}
var nb = {}
/*深拷贝*/
function deepCopy(newobj,oldobj){
for(var i in oldobj){
var item = oldobj[i];
//判断是否是数组
if(item instanceof Array){
newobj[i] = [];
deepCopy(newobj[i],oldobj[i])
}else if(item instanceof Object){
//对象
newobj[i] = {}
deepCopy(newobj[i],oldobj[i])
}else{
newobj[i] = item
}
}
}
deepCopy(nb,obj)
nb.msg.age=34
console.log(obj)
console.log(nb)
修改nb的msg
并不会影响原来的旧对象
JSON.parse(JSON.stringfy())实现深拷贝
这种方式不能处理函数
let arr = [2,3,{user:'hello'}]
let arr4 = JSON.parse(JSON.stringify(arr))
arr4[2].user = 'word'
console.log(arr)
console.log(arr4)