陣列拷貝
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...