1. 浅拷贝的三种方式
- 用等号=直接赋值引用地址
- 通过for in进行循环赋值,若存在嵌套对象时,也属于浅拷贝
let userinfo = {
name: '张三',
age: 18,
address: {
province: '广东',
city: '中山'
}
}
let newinfo = {}
for(let key in userinfo){
newinfo[key] = userinfo[key]
}
newinfo.address.city = '广州'
console.log(newinfo.address.city) //广州
console.log(userinfo.address.city) //广州
- 通过Object.assign
let userinfo = {
name: '张三',
age: 18,
address: {
province: '广东',
city: '中山'
}
}
let newinfo = Object.assign({}, userinfo)
newinfo.address.city = '广州'
console.log(newinfo.address.city) //广州
console.log(userinfo.address.city) //广州
2. 深拷贝的方法
- 通过JSON.stringify和JSON.parse转换
let userinfo = {
name: '张三',
age: 18,
address: {
province: '广东',
city: '中山'
}
}
let newinfo = JSON.parse(JSON.stringify(userinfo))
newinfo.address.city = '广州'
console.log(newinfo.address.city) //广州
console.log(userinfo.address.city) //中山
- 通过递归遍历拷贝
let userinfo = {
name: '张三',
age: 18,
address: {
province: '广东',
city: '中山'
}
}
function func(obj){
if(typeof obj !== 'object'||obj === null){
return obj
}
let newObj
if(obj instanceof Array){
newObj = []
}
else{
newObj = {}
}
for(let key in obj){
if(obj.hasOwnProperty(key)){
newObj[key] = func(obj[key])
}
}
return newObj
}
let newinfo = func(userinfo)
newinfo.address.city = '广州'
console.log(newinfo.address.city) //广州
console.log(userinfo.address.city) //中山