深淺拷貝

let a = {
?????name: 'Dobby',
?????age: 20
?};
?let b = a;
?a.age = 10;
?b.name = ' qzhang';
?console.log(b.age); // output:10
?console.log(a.name); // output:qzhang

從上面例子可以看出,當(dāng)我們把一個(gè)對象賦值給一個(gè)變量的時(shí)候,兩者的值會是同一個(gè)引用,其中一方改變,另一方也會改變。

通常我們在開發(fā)的過程中不希望出現(xiàn)這樣的問題,我們可以使用淺拷貝來解決這個(gè)問題。

淺拷貝

首先,可以通過 Object.assign 來解決這個(gè)問題。

let a = {?
? ? ? name: 'Dobby',?
? ? ? age: 20? ?
};? ?
let b = Object.assign({}, a);? ?
a.age = 10;? ?
b.name = ' qzhang'; ?
console.log(b.age); // output:20?
console.log(a.name); // output:Dobby

還可以使用 展開運(yùn)算符(...)來解決。

let a = {?
? ? ? ?name: 'Dobby',?
? ? ? ?age: 20? ?
};? ?
let b = {...a};? ?
a.age = 10;? ?
b.name = ' qzhang'; ?
console.log(b.age); // output:20?
console.log(a.name); // output:Dobby

通常淺拷貝可以解決大部分問題,但當(dāng)我們在如下例子中對象中還有對象的話,就需要深拷貝了。

let a = {
?????name: 'Dobby',
?????age: 20,
?????job: {
?????????first: 'web'
?????}
?};
?let b = {...a};
?a.age = 10;
?a.job.first = 'java';
?console.log(b.age); // output:20
?console.log(b.job.first); // output:java

深拷貝

通常可以通過 JSON.parse(JSON.stringify(object)) 來解決。

let a = {
?????name: 'Dobby',
?????age: 20,
?????job: {
?????????first: 'web'
?????}
?};
?let b = JSON.parse(JSON.stringify(a));
?a.job.first = 'java';
?console.log(b.job.first); // output:web

但該方法有局限性:

1. 會忽略 undefined
2. 會忽略 symbol
3. 不能序列化函數(shù)
4. 不能解決循環(huán)引用的對象

通常情況下,復(fù)雜數(shù)據(jù)都是可以序列化的,所以這個(gè)函數(shù)可以解決大部分問題,并且該函數(shù)是內(nèi)置函數(shù)中處理深拷貝性能最快的。如果數(shù)據(jù)中有 undefined、symbol、函數(shù)三種情況,可以使用 lodash 的深拷貝函數(shù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • underscore 的源碼中,有很多地方用到了 Array.prototype.slice() 方法,但是并沒有...
    theCoder閱讀 666評論 0 1
  • 代碼輸出 引用類型:對象,數(shù)組,函數(shù),正則表達(dá)式非引用類型:數(shù)值,字符串,布爾值,undefined,null。v...
    傾國傾城的小餅干閱讀 480評論 0 0
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,889評論 0 13
  • 真的是每天在記流水賬。 1、昨天到今天,用自行車搬了兩次家以后。我決定要用58速運(yùn)了,太太太折騰了?;ú涣硕嗌馘X,...
    曼曼風(fēng)雨閱讀 99評論 0 0
  • 看完新的一期《國家寶藏》,陜博的厚重帶給我無比的震撼,作為一個(gè)陜西人的驕傲瞬間在骨子里激蕩。好想再回到陜西,再回到...
    布瓜_479a閱讀 544評論 0 0

友情鏈接更多精彩內(nèi)容