在復(fù)雜數(shù)據(jù)類型(object
挠蛉,Array
)中辐益,數(shù)據(jù)存儲在堆內(nèi)存中断傲,那么對于數(shù)據(jù)的拷貝就出現(xiàn)了兩種情況:拷貝引用和拷貝實(shí)例
淺拷貝:拷貝引用,數(shù)據(jù)存儲在同一內(nèi)存中智政,進(jìn)行修改操作會互相影響
深拷貝:重新分配內(nèi)存认罩,并把源對象的所有屬性都進(jìn)行拷貝,保證拷貝后的對象與源對象是不相干的续捂,操作不會互相影響垦垂。
淺拷貝
- 最簡單的淺拷貝
var a = {a: 1};
var b = a;
console.log(a === b); // true
b.a = 10;
console.log(a, b); // { a: 10 } { a: 10 }
- 源對象拷貝實(shí)例,屬性對象拷貝引用
外層對象是拷貝實(shí)例牙瓢,如果屬性對象時復(fù)雜數(shù)據(jù)類型時劫拗,內(nèi)層元素拷貝引用。
對源對象直接操作矾克,不會影響另一個對象页慷,但對屬性操作時,會影響屬性值
常用方法:Array.prototype.slice()
胁附,Array.prototype.concat()
酒繁,jQuery
的$.extend({}, obj)
,Object.assign()
控妻。
var arr1 = [1, 2, 3];
var arr2 = arr1.slice();
console.log(arr1 === arr2); // false slice返回新的數(shù)組州袒,所以兩個不等
arr1[1] = 10;
console.log(arr1, arr2); // [ 1, 10, 3 ] [ 1, 2, 3 ]
var arr3 = [{a: 1}, {b: 2}];
var arr4 = arr3.slice();
console.log(arr3 === arr4); // false
arr4[0].a = 10;
console.log(arr3, arr4); // [ { a: 10 }, { b: 2 } ] [ { a: 10 }, { b: 2 } ]
深拷貝
常見方法:JSON.parse()
,JSON.stringify()
弓候,jQuery
的$.extend(true, {}, obj)
, lodash
的_.cloneDeep
和_.clone(value, true)
郎哭。
var arr1 = [1, 2, 3];
var arr2 = JSON.parse(JSON.stringify(arr1));
console.log(arr1 === arr2, arr2); // false [ 1, 2, 3 ]
arr1[1] = 10;
console.log(arr1, arr2); // [ 1, 10, 3 ] [ 1, 2, 3 ]