淺析賦值、淺拷貝、深拷貝的區別

何必詩債換酒錢發表於2020-10-25

1、原理

賦值:將某一物件賦給某個變數的過程,稱為賦值。

淺拷貝:淺拷貝是建立一個物件,這個物件有著原始物件屬性值的一份精準拷貝,如果屬性是基本型別,拷貝的就是基本型別的值;如果屬性是引用型別,拷貝的就是記憶體地址,如果其中一個物件改變了這個地址,就會影響到另一個物件。

深拷貝:深拷貝就是將一個物件從記憶體中完整的拷貝一份出來,從堆記憶體中開闢一個新的區域存放新物件,且修改新物件不會影響原有的物件。

2、區別

賦值:當我們將一個物件賦值給另外一個新的變數時,賦的其實是該物件在棧中的地址,而不是堆中的資料。也就是說,兩個物件同時指向一個儲存空間,是聯動的,無論修改哪個物件都會影響另一個物件。

淺拷貝:如果拷貝物件修改的屬性是基本資料型別,則不會影響原始物件;如果修改的屬性是引用型別,則會影響原始物件。

深拷貝:新拷貝物件會在記憶體中拷貝一份新的資料儲存,因此不論如何修改都不會改變原有物件。

3、實現方式

淺拷貝:

const originObj = {person: 'Jack'};
// 1.Object.assign()
const newObj1 = Object.assign({}, originObj);
// 2.Lodash中的_.clone()方法
const newObj2 = _.clone(originObj);
// 3.展開運算子...
const newObj3 = {...originObj};
// 4.array.prototype.concat()
const newObj4 = ['1','2','3'].concat();
// 5.array.prototype.slice()
const newObj5 = ['1','2','3'].slice();

深拷貝:

const originObj = {person: 'Jack'};
// 1.JSON.parse(JSON.stringify())
const newObj1 = JSON.parse(JSON.stringify(originObj));
// 2.Lodash中的_.cloneDeep()方法
const newObj2 = _.cloneDeep(originObj);
// 3.extend()
const newObj3 = $.extend(true, {}, originObj);

相關文章