賦值:
當我們把乙個物件賦值給乙個新的變數時,賦的其實是該物件在棧中的位址,而不是堆中的資料。
也就是兩個物件指向同乙個內儲存空間,無論哪個物件發生改變,其實都是改變儲存空間的內容,因此兩個物件是聯動的
>
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 基本資料型別,儲存在 棧 中,記憶體可以及時 引用型別值是可變的,比較是引用的比較,看其引用是否指向同乙個物件 引用...