js陣列物件拷貝

2021-09-22 19:47:47 字數 2484 閱讀 4519

陣列拷貝

var arr = [, ['old']];

var new_arr = arr.concat();

arr[0].old = 'new';

new_arr[1][0] = 'new';

console.log(arr); // [, ['new']]

console.log(new_arr); // [, ['new']]

// 如果陣列元素是基本型別,就會拷貝乙份,互不影響,而如果是物件或者陣列,就會只拷貝物件和陣列的引用,這樣我們無論在新舊陣列進行了修改,兩者都會發生變化。這種叫淺拷貝 

// 深拷貝就是指完全的拷貝乙個物件,即使巢狀了物件,兩者也相互分離,修改乙個物件的屬性,也不會影響另乙個。

for實現陣列的深拷貝

var arr = [1,2,3,4,5]

var arr2 = copyarr(arr)

function copyarr(arr)

return res

}

他是將原陣列中抽離部分出來形成乙個新陣列

var arr = [1,2,3,4,5]

var arr2 = arr.slice(0)

arr[2] = 5

var arr = [1,2,3,4,5]

var arr2 = arr.concat()

arr[2] = 5

var arr = [1,2,3,4,5]

var [ ...arr2 ] = arr

arr[2] = 5

淺拷貝和深拷貝都是對於js中的引用型別而言的,淺拷貝就只是複製物件的引用(堆和棧的關係,簡單型別undefined,null,boolean,number和string是存入堆,直接引用,object array 則是存入桟中,只用乙個指標來引用值),如果拷貝後的物件發生變化,原物件也會發生變化。只有深拷貝才是真正地對物件的拷貝。

物件淺拷貝

var object1 =

};

// 淺拷貝

var copy = object.assign({}, object1);

// 改變原物件屬性

object1.a = 2;

object1.obj.b = 'newstring';

console.log(copy.a); // 1

物件深拷貝

var obj = };

// 深拷貝

var newobj = json.parse(json.stringify(obj));

// 改變原物件的屬性

obj.b.c = 20;

console.log(obj); // }

console.log(newobj); // }

物件必須遵從json的格式

擴充套件運算子實現物件的深拷貝

var obj =

var = obj

obj.old = '22'

console.log(obj)

console.log(obj2)

陣列物件深拷貝

let arr = [1, ];

function deepcopy(arr) ; // 判斷是陣列還是物件

for(let i in arr) else

}return copyarr;

}let copyarr = deepcopy(arr);

console.log(copyarr ) // [1, ]

arr[1].a = 3;

console.log(copyarr ) // [1, ]

copyarr[1].a = 5;

console.log(arr) // [1, ]

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...