js淺拷貝與深拷貝

2021-09-26 05:51:31 字數 2028 閱讀 3196

了解淺拷貝與深拷貝之前下了解一下堆與棧

堆和棧的區別

其實深拷貝和淺拷貝的主要區別就是其在記憶體中的儲存型別不同。

堆和棧都是記憶體中劃分出來用來儲存的區域。

棧(stack)為自動分配的記憶體空間,它由系統自動釋放;

堆(heap)則是動態分配的記憶體,大小不定也不會自動釋放。

js的基本資料型別和引入資料型別

基本資料型別:number string boolean undefined null

複雜資料型別(引用型別):object 物件(包括陣列和函式)

基本資料型別存放在棧中

基本資料型別值不可變

基本型別的比較是值的比較

比較的時候最好使用嚴格等,因為 == 是會進行型別轉換的,值得注意的是js中||與&&,它們的返回值並不一定是布林值。js中整個邏輯運算表示式返回的結果是:「能夠決定整個邏輯運算表示式的結果的那個運算元的值」!

var a = 42;

var b = "csdn";

var c = null;

a || b; //返回值是:42,a隱式轉換為true---->此時這個表示式的結果由a決定,所以返回a的值

a && b; //返回值是:"csdn" a為true,這個表示式的結果由b決定--->所有返回b的值

c || b; //返回值是:"csdn" c為false,此時表示式的結果由b決定--->返回b的值

c && b;//返回值是:null c為false,決定了表示式的結果--->返回c的值

引用型別存放在堆中

引用型別值可變

var a = [1,2,3];

a[1] = 5;

console.log(a[1]); // 5

引用型別的比較是引用的比較

傳值與傳址的區別

深拷貝和淺拷貝簡單解釋

淺拷貝和深拷貝都只針對於引用資料型別

區別:

賦值(=)、淺拷貝和深拷貝的區別

和原資料是否指向同一物件

第一層資料為基本資料型別

原資料中包含子物件賦值是

改變會使原資料一同改變

改變會使原資料一同改變

淺拷貝否

改變不會使原資料一同改變

改變會使原資料一同改變

深拷貝否

改變不會使原資料一同改變

改變不會使原資料一同改變

淺拷貝:將 b 物件拷貝到 a 物件中,但不包括 b 裡面的子物件

var obj = 

}var obj1 = obj; //obj:原始資料 obj1:賦值操作得到

console.log(obj1.name);

var obj2={};

// 淺拷貝的封裝

function extend(a, b)

}extend(obj1,obj2);//obj2:淺拷貝得到

console.log(obj1.name, obj2.name);

深拷貝:將 b 物件拷貝到 a 物件中,包括 b 裡面的子物件

var obja=,

dog:

}function extenddeep(a,b) else if (item instanceof object );

extenddeep(item,b[key]);

} else }}

var objb={};

extenddeep(obja,objb);

console.log(objb);

js深拷貝與淺拷貝

1 基礎知識 基本型別與引用型別 js中可以把變數分成兩部分,基本型別和引用型別。基本型別包括 undefined null boolean number和string 引用型別值可能由多個值構成的物件。在對基礎型別資料進行拷貝時,實際相當於建立新的相同資料 hello 賦值給b var a hel...

js 淺拷貝與深拷貝

js 有兩種資料型別,基礎資料型別和引用資料型別 基礎資料型別都是按值訪問的,我們可以直接操作儲存在變數中的實際的值。而引用型別如array,1.淺拷貝 只複製指向某個物件的指標,而不複製物件本身,新舊物件共享一塊記憶體 淺拷貝是指只複製一層物件,當物件的屬性是引用型別時,實質複製的是其引用,當引用...

js深拷貝與淺拷貝

實現乙個頁面或者乙個功能時,常常遇到的場景需要我們備份乙個陣列或者物件,這時候出現了深拷貝與淺拷貝效果截然不同呀總結如下 var arr 1,2,3,4 shallowarr arr arr 0 change console.log arr console.log shallowarr change...