JS陣列和物件實現深拷貝

2021-09-28 07:28:50 字數 3290 閱讀 1171

for 迴圈

//for 迴圈 copy

function

copyfun

(arr)

return copyarr;

}let arr1 =[1

,2,3

,4];

let arr2 =

copyfun

(arr1)

;//[1, 2, 3, 4]

console.

log(arr2)

//[1, 2, 3, 4]

arr2[0]

=10;console.

log(arr1)

//[1, 2, 3, 4]

console.

log(arr2)

//[10, 2, 3, 4]

slice 方法實現深拷貝

let arr1 =[1

,2,3

,4];

let arr2 = arr1.

slice(0

);arr2[0]

=10;console.

log(arr1)

;//[1, 2, 3, 4]

console.

log(arr2)

;//[10, 2, 3, 4]

concat 方法實現深拷貝

let arr1 =[1

,2,3

,4];

let arr2 = arr1.

concat()

;arr2[0]

=10;console.

log(arr1)

;//[1, 2, 3, 4]

console.

log(arr2)

;//[10, 2, 3, 4]

es6 擴充套件運算實現深拷貝

let arr1 =[1

,2,3

,4];

let arr2 =

[...arr1]

;arr2[0]

=10;console.

log(arr1)

//[1, 2, 3, 4]

console.

log(arr2)

//[10, 2, 3, 4]

json.parse() 與 json.stringify()

let arr1 =[1

,2,3

,4];

let arr2 =

json

.parse

(json

.stringify

(arr1));

arr2[0]

=10;console.

log(arr1)

//[1, 2, 3, 4]

console.

log(arr2)

//[10, 2, 3, 4]

物件的迴圈

function

copyfun

(obj)

;for

(let key in obj)

return copyobj

}let person1 =

let person2 =

copyfun

(person1)

;person2.name =

"mamo"

console.

log(person1)

// console.

log(person2)

//

json.parse() 與 json.stringify()

let obj1 =

, a: undefined,

b:function

(n, m)

, c:

symbol

("foo")}

;let obj2 =

json

.parse

(json

.stringify

(obj1));

console.

log(obj1)

//, a: undefined, b: ƒ, c: symbol(foo)}

console.

log(obj2)

//} obj2.y.d =2;

//修改obj2.y.d

console.

log(obj1)

//, a: undefined, b: ƒ, c: symbol(foo)}

console.

log(obj2)

//}

此辦法可實現多維物件的深拷貝。但是請注意:進行json.stringify() 序列化的過程中會把undefined、任意的函式以及 symbol 值,在序列化過程中會被忽略(出現在非陣列物件的屬性值中時)或者被轉換成 null(出現在陣列中時),也就是null值正常保留。

es6 擴充套件運算

let person1 =

let person2 =

person2.name =

"mamo"

console.

log(person1)

//console.

log(person2)

//

object.assign()

請注意:object.assign() 只能實現一維物件的深拷貝。

let obj1 =

;let obj2 = object.

assign

(, obj1)

;console.

log(obj1)

// console.

log(obj2)

// obj2.x =2;

// 修改 obj2.x

console.

log(obj1)

// console.

log(obj2)

// let obj3 =};

let obj4 = object.

assign

(, obj3)

; // }

// }

obj4.y.d =2;

// 修改 obj4.y.d

console.

log(obj3)

// }

console.

log(obj4)

// }

js陣列,物件深拷貝

無事,封裝了乙個js深拷貝的方法 基本思路 deepcopy data data 可能是陣列也可能是物件 1.判斷data是陣列 物件或者其他資料型別 2.宣告空陣列 或者 空物件 res 3.分別處理 如果陣列元素或物件屬性值不是陣列或物件,空陣列或物件之間接收元素 res.push data i...

js 陣列物件深拷貝

如何區分深拷貝與淺拷貝,簡單點來說,就是假設b複製了a,當修改a時,看b是否會發生變化,如果b也跟著變了,說明這是淺拷貝,拿人手短,如果b沒變,那就是深拷貝,自食其力 我們希望在改變新的陣列 物件 的時候,不改變原陣列 物件 我們在使用深拷貝的時候,一定要弄清楚我們對深拷貝的要求程度 是僅 深 拷貝...

js 陣列物件深拷貝

結論 物件的拷貝不能採用直接賦值的方式。踩過的坑如下 formdata本來是父元件傳過來的,但是我不想直接用,於是我直接賦值給乙個formdatacopy的物件。但是詭異的事情發生了,就是在我填寫自己的表單元件的時候,一旦表單的資料發生的變化時,本來是formdatacopy的值發生變化,但是 fo...