JS賦值 淺拷貝和深拷貝

2021-10-10 16:33:36 字數 1601 閱讀 6772

賦值:

當我們把乙個物件賦值給乙個新的變數時,賦的其實是該物件在棧中的位址,而不是堆中的資料。

也就是兩個物件指向同乙個內儲存空間,無論哪個物件發生改變,其實都是改變儲存空間的內容,因此兩個物件是聯動的

>

var person =

console.

log(person)

var person1 = person

person1.name =

"pat"

person.hobby[0]

='讀書'

console.

log(person)

//person和person1的輸出相同

console.

log(person1)

script

>

淺拷貝:

如果拷貝的物件是基本資料型別,那麼拷貝的就是基本型別的值

如果拷貝的物件是引用資料型別,那麼拷貝的就是記憶體位址

重新在堆中建立記憶體,拷貝前後物件的基本資料型別互不影響,但拷貝前後物件的引用型別因共享一塊記憶體,會互相影響

>

var person =

//淺拷貝函式

function

shallowcopy

(obj)

}return perobj

}//最終輸出基本資料型別是不同的,但引用資料型別是相同

//改變person1的基本資料型別的資料person的基本資料型別資料不會發生改變

//改變person1的引用資料型別的資料person的引用資料型別的資料還是會發改變

var person1 =

shallowcopy

(person)

person1.name =

'pat'

console.

log(person)

console.

log(person1)

person1.hobby[0]

='play'

console.

log(person)

script

>

深拷貝:

從堆記憶體中開闢乙個新的區域存放新物件,對物件中的子物件進行遞迴拷貝,拷貝前後兩個物件互不影響

也就是說改變person1中任何資料,person中的資料都不會隨之改變

>

var person =

//深拷貝函式

function

deepclone

(obj)

else}}

return cloneobj

}var person1 =

deepclone

(person)

person1.name =

'pat'

person1.hobby[0]

='play'

console.

log(person)

console.

log(person1)

script

>

淺拷貝 深拷貝和淺賦值 深賦值

include includeusing namespace std class string else 淺拷貝 也就是系統預設的拷貝,可寫可不寫。string const string s 預設的拷貝構造 深拷貝 string const string s string s2 s1 深賦值 str...

賦值 淺拷貝和深拷貝

三種方法的形式存在一定的類似,但是也存在各個之間不相同的地方。淺拷貝和深拷貝是用在物件 object 或者陣列 array 這樣的資料型別拷貝賦值時候的說法,而賦值操作也可以用在基礎的資料型別,如number string等 賦值 對於物件型別資料的影響 賦於該值在棧中的位址,而不是堆中的資料,使得...

賦值 淺拷貝 深拷貝

堆是動態分配記憶體,記憶體大小不一 棧是自動分配相對固定大小的記憶體空間,並由系統自動釋放 基本資料型別值是不可變的,比較是值的比較 基本資料型別,傳值。開闢乙個新的記憶體空間 js 基本資料型別,儲存在 棧 中,記憶體可以及時 引用型別值是可變的,比較是引用的比較,看其引用是否指向同乙個物件 引用...