1.浅拷贝
首先可以通过Object.assign来解决这个问题,Object.assign只会拷贝所有的属性值到新的对象中,如果属性值是对象的话,拷贝的是地址。所以并不是深拷贝。
let a = {
age: 1
}
let b = Object.assign({},a)
a.age = 2
console.log(b.age) // 执行结果为 1
另外还可以通过展开运算符 … 来实现浅拷贝
let a = {
age: 1
}
let b = {...a}
a.age = 2
console.log(b.age) // 执行结果为 1
通常浅拷贝只解决了一层对象的问题,如果接下去的值还有对象的话,那么就需要进行深拷贝了。
例如:
let a = {
age: 1,
jobs: {
first: 'FE'
}
}
let b = { ...a }
a.jobs.first = 'native'
console.log(b.jobs.first) // native
要解决这个问题就需要深拷贝了。
2.深拷贝
可以通过JSON.parse(JSON.stringify(object)) 来解决
let a = {
age: 1,
jobs: {
first: 'FE'
}
}
let b = JSON.parse(JSON.stringify(a))
a.jobs.first = 'native'
console.log(b.jobs.first) // FE
但是该方法也是由局限性的
- 会忽略 undefined
- 会忽略 symbel
- 不能序列化函数
- 不能解决循环引用的对象