深浅拷贝总结

99 阅读1分钟

直接上代码🙌

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 不能序列化函数 不能解决循环引⽤的对象