淺拷貝與深拷貝

2021-10-06 10:47:00 字數 3661 閱讀 9288

<

!doctype html>

"en"

>

"utf-8"

>

"viewport" content=

"width=device-width, initial-scale=1.0"

>

document<

/title>

// 基本資料型別:number、string、boolean、null、undefined、symbol、bigint(新引入的)

// 引用資料型別:object、array、function等

// 對物件而言,它的第一層屬性值如果是基本資料型別則完全拷貝乙份資料,

// 如果是引用型別就拷貝記憶體位址

// 實現 object.assign()

let obj1 =

}let obj2 = object.

assign

(, obj1)

console.

log(obj2)

// }

console.

log(obj1)

// }

obj2.age.value =

28 console.

log(obj2)

// }

console.

log(obj1)

// } // 指向同乙個記憶體位址 一變皆變

// console.log(obj1 === obj2) // false

obj1.name =

'oupai'

console.

log(obj1)

// } // 承接最近的值

console.

log(obj2)

// } // 承接最近的值

// 展開語法

let aaa =

}let

= aaa

bbb.name =

'guanyu'

bbb.age.value =

20 console.

log(bbb)

// } 引用型別變了(位址一致)

console.

log(aaa)

// } 引用型別變了(位址一致)

let b =

, c:

} console.

log(b)

// ,c:}

// array.prototype.slice

const arr1 =

['yang',]

const arr2 = arr1.

slice(0

)// slice 提取字串的某個部分 slice(0) 就是全部

console.

log(arr2)

// ['yang',]

arr2[1]

.value =

456 console.

log(arr1)

// ['yang',]

console.

log(arr2)

// ['yang',]

arr2[0]

='haha'

console.

log(arr2)

// ['haha',]

console.

log(arr1)

// ["yang", ]

const arr3 =

['yang',]

const arr4 =

.concat

(arr3)

console.

log(arr4)

// ['yang',]

arr4[1]

.value =

456 console.

log(arr4)

// ['yang',]

console.

log(arr3)

// ['yang',]

arr4[0]

='haha'

console.

log(arr4)

// ['haha',]

console.

log(arr3)

// ['yang',]

<

/script>

<

/head>

<

/body>

<

/html>

<

!doctype html>

"en"

>

"utf-8"

>

"viewport" content=

"width=device-width, initial-scale=1.0"

>

document<

/title>

// 深拷貝就是不管是基本資料型別還是引用資料型別都重新拷貝乙份, 不存在共用資料的現象

// 暴力版本 json.parse(json.stringify(object))

let obj1 =

}let obj2 =

json

.parse

(json

.stringify

(obj1)

) console.

log(obj2)

// }

console.

log(obj1)

// }

obj2.age.value =

28 console.

log(obj2)

// console.

log(obj1)

// } // 不存在共用資料的現象

// 看看它的缺陷

var obj3 =

, date:

newdate()

, symbol:

symbol()

, a:

null

, b:

undefined

, c:

, e:

newregexp

('regexp'),

f:newerror

('error')}

let obj4 =

json

.parse

(json

.stringify

(obj3)

) console.

log(obj4)

// , e: {}, f: {}}

// 缺陷

// 1.會忽略undefined

// 2.會忽略symbol

// 3.不能序列化函式

// 4.不能解決迴圈引用的現象

// 5.不能正確處理new date()

// 6.不能處理正則

// 7.不能處理new error

<

/script>a:

1<

/head>

<

/body>

<

/html>

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝與深拷貝

淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...

「淺拷貝」與「深拷貝」

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...