淺拷貝直接賦值 前端面試之深淺拷貝(詳細)

2021-10-12 21:46:50 字數 2047 閱讀 9660

深拷貝和淺拷貝在面試中會經常遇到的,主要考察你基本型別和引用型別的理解深度在大部分面試中,經常會一些簡單回答,比如:淺拷貝只拷貝位址,深拷貝拷貝值,淺拷貝修改老資料會影響新資料,雖然這樣回答也是沒問題的,但是如果兄弟們在回答的時候能夠延伸點,詳細點,面試也是加分項奧

深拷貝和淺拷貝主要是針對物件的屬性是物件(引用型別)

1.先了解記憶體

在任何程式語言的記憶體分割槽幾乎是一樣的

記憶體是儲存資料的,不同型別的資料也要存在不同的區域,就是分類存放的意思

記憶體分為4個區域:棧區,堆區,全域性靜態區,唯讀區

2.基本型別和引用型別在記憶體上儲存的區別

現在只看棧區和堆區,不管其他區域,也假定只是區域性變數

以上是test在呼叫時,

3.所以呢,到底什麼是基本型別,什麼是引用型別呢

以上的變數的arr就是引用型別,arr所對應的記憶體中儲存的位址,真正的資料是在記憶體儲存的區域中

你可以認為賦值就是在拷貝

1.基本型別

2.引用型別

引用型別的拷貝,淺拷貝,只拷貝了位址,修改老資料,會影響新資料,因為他們儲存著相同的位址,引用的資料是共享的

如果在上邊的基礎上在增一句**:

arr[0]=10,那麼記憶體會將會有如下變化:

1.基本型別作為函式的引數

2.引用型別作為函式的引數:

拷貝通俗點就是賦值,把乙個變數賦給另乙個變數,就是把變數的內容進行拷貝,把乙個物件的值賦給另乙個物件,就是把乙個物件拷貝乙份

1.基本型別肯定沒有問題的

因為基本型別在賦值時,賦的時資料,所以不存在深淺拷貝的問題

如下圖:

2.引用型別有問題

因為引用型別賦值時,賦的值時位址(就是引用記憶體變數在記憶體中儲存的內容)如下

改變了其中的乙個裡面的值,另乙個值也會跟著改變,原因就是他們共同引用了同一塊記憶體區域

這是最簡單的淺拷貝,因為,只是把arr的位址拷貝了乙份給arr2,並沒有把arr的資料拷貝乙份。所以拷貝的深度不夠

3.用json物件的方式(也是引用型別)來演示淺拷貝和深拷貝

(1)淺拷貝

在控制台列印的結果a和a2的books都變成了「崩牙駒」

(2)深拷貝(初步)

在空中臺列印的結果,只有a2的books變成了崩牙駒;這就是深拷貝,只拷貝值,修改其中的乙個資料不會影響到另乙個資料

前端的深拷貝和淺拷貝 前端面試 深拷貝和淺拷貝

面試題目 如何實現對乙個陣列或物件的淺拷貝和深拷貝?wtf,複製還分兩種,第一次遇到這種問題的時候很是無語呢,先來看看一般的答案的理解。淺拷貝是只拷貝一層,深層次的物件級別就只拷貝引用。深拷貝是拷貝多層,每一級別的資料都拷貝出來。也就是說,基本資料型別其實不存在深淺拷貝的問題,只有物件和陣列才存在深...

前端面試之淺拷貝深拷貝

淺拷貝 定義 對於字串型別,淺複製是對值的複製,對於物件來說,淺複製是對物件位址的複製,並沒 有開闢新的棧,也就是複製的結果是兩個物件指向同乙個位址,修改其中乙個物件的屬性,則另乙個物件的屬性也會改變 方法 1,object.assign es6中拷貝物件的方法,接受的第乙個引數是拷貝的目標targ...

js 淺拷貝直接賦值 js的賦值與淺拷貝 深拷貝

昨天翻了下陣列api,看到concat和slice方法,突然想到這個兩個方法是淺拷貝還是深拷貝,結果陷入了死胡同,為什麼mdn文件說是淺拷貝,但進行簡單的操作為什麼能複製成功啊,糾結半天後才弄清原由,原來我一直把賦值和深淺拷貝搞混了。首先不要把引用型別的賦值歸結為淺拷貝,深拷貝和淺拷貝只針對像 ob...