深拷貝和淺拷貝的問題

2021-08-31 23:57:38 字數 2273 閱讀 1266

不拷貝 =》 賦值

舉個例子:

let a =

}let b = a;

b.a =20;

console.

log(a.a)

// 20

直接賦值的話,物件是指向同一記憶體,所以修改物件b的屬性,物件a的屬性同時也會改變

淺拷貝 => object.assign(),和解構賦值.

舉個例子

let a =

}let b = object.

assign

(,a)

;b.a =20;

b.c.d =20;

console.

log(a.a)

// 1

console.

log(a.c.d)

// 20

// 解構賦值方式同樣只能拷貝到第一層

let b =

;b.a =20;

b.c.d =20;

console.

log(a.a)

// 1

console.

log(a.c.d)

// 20

因為這種方法只拷貝了一層,內層的物件依然會指向同一記憶體,所以還會互相影響。

深拷貝 => json.stringify&json.parse,lodash

方法一: json.stringify&json.parse

舉個例子:

let a =

}// json.stringify(obj) 先將物件轉換為字串

// json.parse(str) 然後再將字串轉為物件。

let b =

json

.parse

(json

.stringify

(a))

b.a =20;

b.c.d =20;

console.

log(a.a)

// 1

console.

log(a.c.d)

// 10

console.

log(b.a)

// 20

json.stringify在轉換date,regexp物件及function時會出現問題,同時也會忽略undefined、function

//date 型別

var o =

newdate()

;console.

log(o.

tostring()

);// mon nov 06 2017 11:23:35 gmt+0800 (china standard time) 本地標準時間

console.

log(

json

.stringify

(o))

;// "2017-11-06t03:23:35.547z" 國際標準時間

因為stringify預設呼叫的是object的tojson方法,所以重寫date的tojson,然後stringify就是ok的。

date.prototype.

tojson

=function()

console.

log(

json

.stringify

(o))

;// "11/6/2017, 11:23:35 am"

// 同理regexp

r1 =

/\d+/

;console.

log(

json

.stringify

(r1));

// {}

regexp.prototype.

tojson

=function()

console.

log(

json

.stringify

(r1));

// "/\\d+/"

方法二:

借助jquery或者lodash庫

//jquery

let y = $.

extend

(true

,,x)

//第乙個引數 必須為true

//lodash庫

let y = _.

clonedeep

(x);

深拷貝和淺拷貝問題

下午遇到乙個關於乙個表的數值拷貝的問題,有點意思,不多說,直接上 記錄玩家的資訊 self.userinfo for i 1,play count do table.insert self.userinfo,self.deskuserlist getuserbydeskstation i 1 end...

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...

淺拷貝和深拷貝

以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...