物件的淺拷貝與深拷貝

2021-10-12 17:45:57 字數 1783 閱讀 1829

工作中可能會遇到這樣乙個問題,我明明把資料拷貝了乙份,但改變拷貝後的資料居然同時會改變原始資料中的值。那就來看看為什麼吧,希望這篇文章可以給你解惑。

「只拷貝了資料物件的第一層,深層次的資料值與原始資料會互相影響(拷貝後的資料與原始資料還存有關聯)」

常見淺拷貝的方式:object.assign()擴充套件運算子

const obj1 =

}const obj2 = object.

assign

(, obj1)

// 或者

const obj2 =

obj2.name =

'cat'

obj2.info.age =

4console.

log(obj1)

// }

console.

log(obj2)

// }

當拷貝後的物件obj2資料改變的時候會影響原始資料obj1,因為info物件拷貝的是源物件指標。

不清楚指標的可以看前面的這篇文章

js基礎面試高頻(一):資料型別

「不管資料物件有多少層,改變拷貝後的值都不會影響原始資料的值。(拷貝後的資料與原始資料毫無關係)」

常見深拷貝的方式:json.parse()json.stringify()配合使用

const obj1 =

, fn:

function()

}const obj2 =

json

.parse

(json

.stringify

(obj1)

)obj2.name =

'cat'

obj2.info.age =

4console.

log(obj1)

// , fn: function(){} }

console.

log(obj2)

// }

這種方式有乙個弊端,就是無法正確處理函式正則

我們也可以手寫乙個深拷貝的方法(簡易基礎版)

function

deepclone

(source)

// 校驗要拷貝的資料是物件還是陣列

const target = array.

isarray

(source)?[

]:for(

const k in source)`)

()}else

if(valuetype ===

'object'

)else

}return target

}const obj1 =

, fn:

function()

}const obj2 =

deepclone

(obj1)

obj2.name =

'cat'

obj2.info.age =

4console.

log(obj1)

// , fn: function(){} }

console.

log(obj2)

// , fn: function(){} }

js 物件深拷貝 深拷貝與淺拷貝

前言 最近在複習一些面試的知識點,剛剛好複習到了這一部分,於是就寫下這篇文章記錄一下。一 值型別和引用型別 在學習深拷貝和淺拷貝之前,我們先來了解一下js的變數型別。值型別 vs 引用型別 值型別 值型別主要有 number,string,boolean,symbol,null,undefined ...

js物件淺拷貝與深拷貝

在js中,如果乙個物件,作為變數賦值給另乙個物件,那麼兩個物件得值會是相同得引用位址,其中乙個改變,另外乙個也會隨之改變。var obj1 var obj2 obj1 obj2.num 456 console.log obj1.num 輸出 456 複製 在我們日常開發過程當中,我們去複製乙個物件得...

Map物件的淺拷貝與深拷貝

問題 map拷貝時發現資料會變化。先看例子 public class copymap 上面程式的期望輸出值是,mapfrist的值均為1,但是實際上輸出結果為 這裡是因為map發生了淺拷貝,mapfirst只是複製了map的引用,和map仍使用同乙個記憶體區域,所以,在修改map的時候,mapfir...