js的深拷貝與淺拷貝的區別

2021-10-13 04:52:58 字數 1687 閱讀 3866

棧(stack)會自動分配記憶體空間,會自動釋放。堆(heap)動態分配的記憶體,大小不定也不會自動釋放

堆(heap)和棧(stack)

棧(stack)會自動分配記憶體空間,會自動釋放。堆(heap)動態分配的記憶體,大小不定也不會自動釋放

基本型別: undefined、null、boolean、number、string, 按值存放在棧記憶體中的簡單資料段, 可以直接訪問.

引用型別: 存放在堆記憶體中的物件, 變數儲存的是乙個指向存放資料位置的指標. 訪問引用型別(object, array)的值時, 首先從棧中獲取到存放該資料位置的指標, 然後再從堆中取得資料.

淺拷貝: 淺拷貝是拷貝引用, 拷貝後的引用都是指向同乙個存放資料位置的指標, 無論操作哪乙個都是在操作指向在堆中的那乙個資料, 所以雙方都會有影響.

深拷貝: 在堆中重新分配記憶體, 將源物件的各個屬性複製進去. 對拷貝物件和源物件各自操作互不影響.

淺拷貝的方法

淺拷貝分兩種情況, 拷貝源物件的引用和源物件拷貝例項, 但其屬性拷貝引用.

**拷貝源的引用**

let obj1 =

let obj2 = obj1

obj2.name = 'jack'

console.log(obj1)

// jack

**源物件拷貝例項, 其屬性物件拷貝引用**

let obj1 =

};let obj2 = object.assign({}, obj1);

obj2.a = 2;

obj2.b[0] = 2;

obj2.c.c1 = 10

console.log(obj1);

/**輸出結果:

}**/

let obj =

}let obj2 =

obj2.name = 'jack ma'

obj2.info.age = 19

console.log(obj)

輸出結果:

,name: "jason"

}

深拷貝

let obj1 = 

};let obj2 = json.parse(json.stringify(obj1));

obj2.a = 2;

obj2.b[0] = 2;

obj2.c.c1 = 10

console.log(obj1);

/**輸出結果:

}const $ = (function ()

for (var i = types.length; i--;) ;

})(types[i]);

} return $;

})();//型別判斷

function deepclone(source, target)

target = target || (array.isarray(source) ? : {});

for(let i in source) ;

deepclone(source[i], target[i])

} else

};return target;

}**/

JS的深拷貝與淺拷貝

淺拷貝 淺拷貝是拷貝引用,拷貝後的引用都是指向同乙個物件的例項,彼此之間的操作會互相影響 深拷貝 在堆中重新分配記憶體,並且把源物件所有屬性都進行新建拷貝,以保證深拷貝的物件的引用圖不包含任何原有物件或物件圖上的任何物件,拷貝後的物件與原來的物件是完全隔離,互不影響 淺拷貝 淺拷貝分兩種情況,拷貝直...

js的深拷貝與淺拷貝

前言 在說拷貝之前,先說說js中的資料儲存,我們知道js這廣義上資料型別分為兩種,原始資料型別和引用資料型別,原始資料型別包括string,boolean,number,null,undefined,symbol,引用型別有function,array,object,date,regexp等等其實這...

JS的深拷貝與淺拷貝

深拷貝和淺拷貝主要是針對物件賦值的。物件a賦值給物件b,實際上只是b接受了a物件的指標。當引用物件b時,先引用a的位址,再引用a的屬性和方法。這樣,如果對a的屬性值進行修改的時候,再引用b時,b的屬性值也會發生變化。為了避免這種混亂的局面,js提出淺拷貝和深拷貝的概念。淺拷貝 object.assg...