直接上代码🙌
let a = { age: 1 }
let b = a
a.age = 2
console.log(b.age) // 2
从上述例⼦中我们可以发现,如果给⼀个变量赋值⼀个对象,那么两者的值会是同⼀个引 ⽤,其中⼀⽅改变,另⼀⽅也会相应改变。
浅拷⻉
//1.Object.assign
let a = { age: 1 }
let b = Object.assign({}, a)
a.age = 2 console.log(b.age) // 1
//2.运算符(…)
let a = { age: 1 }
let b = {...a}
a.age = 2
console.log(b.age) // 1
浅拷⻉只解决了第⼀层的问题,如果接下去的值中还有对象的话,那么就⼜回到刚开始的话 题了,两者享有相同的引⽤。要解决这个问题,我们需要引⼊深拷⻉。
深拷⻉
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 会忽略 symbol 不能序列化函数 不能解决循环引⽤的对象