我們知道,對象類型在賦值的過程中其實是復制了地址,所以如果改變了一方,其他都會被改變。我們應該如何克隆一個對象,並且避免這種現象的發生呢?
方法一:Object.assign
function copy(obj){
return Object.assign({}, obj);
}
方法二:…展開運算符
function copy(obj){
return { …obj };
}
方法一,方法二是淺拷貝,也就是當對象層級大於2層時,復制到的還是地址信息
let a = {age:1,
jobs: {first:'FE’}
}
let b = copy(a)
a.jobs.first =‘native'
console.log(b.jobs.first)// native
方法三:JSON
function copy(obj){
return JSON.parse(JSON.stringify( obj ));
}
- 會忽略undefined,fn
- 不能序列化函數
- 不能解決循環引用的對象
方法四:MessageChannel
function structuralClone(){
return new Promise(resolve =>{
const {port1,port2} = new MessageChannel()
port2.onmessage = ev => resolve(ev.data)
port1.postMessage(obj)
})
}
obj2 = await structuralClone(obj1);
- 如果對象中有函數,會報錯
- 可以解決循環引用的對象
- 異步 await