JS 深拷貝和淺拷貝概念,以及實現深拷貝的三種方式

2022-02-25 09:32:19 字數 1583 閱讀 5705

1、堆疊

棧(stack):系統自動分配的記憶體空間,記憶體會由系統自動釋放,用來存放函式的引數值,區域性變數的值等,特點是先進後出。

堆(heap):系統動態分配的記憶體,記憶體大小不一,記憶體不會自動釋放。一般由程式設計師分配釋放,主要負責像obejct這種變數型別的儲存。

2、基本資料型別

概念:存放在棧記憶體中的簡單資料段,資料大小確定,記憶體空間大小確定。

6種基本資料型別:undefined、null、boolean、number、string、symbol

3、引用資料型別1、淺拷貝

概念:子物件複製父物件,父子物件發生關聯,兩者屬性值指向同一記憶體空間。簡單來講,就是改變其中乙個物件,另乙個物件也會跟著改變。

舉例:

let a = [0,1,2],

b =a;

a[0] = 3;

console.log(a,b)

//[3,1,2] [3,1,2]

2、深拷貝

概念:拷貝物件各個層級的屬性。簡單的講,就是複製出來的每個物件都有屬於自己的記憶體空間,不會互相干擾。

1、封裝深拷貝函式

function

deepclone(obj) ;

if(obj && typeof obj === "object")

else}}

}

return

objclone

}

let a = [1,2,3,4],

b =deepclone(a);

a[0] = 5;

console.log(a,b)

2、借用json物件的 parse 和 stringify

function

deepclone(obj)

let a=[0,1,[2,3],4],

b=deepclone(a);

a[0]=1;

a[2][0]=1;

console.log(a,b);

原理:基本型別拷貝是直接在棧記憶體新開空間,直接複製乙份名-值,兩者互不影響。

而引用資料型別,比如物件,變數名在棧記憶體,值在堆記憶體,拷貝只是拷貝了堆記憶體提供的指向值的位址,而json.stringify()巧就巧在能將乙個物件轉換成字串,也就是基本型別,那這裡的原理就是先利用json.stringify()將物件轉變成基本資料型別,然後使用了基本型別的拷貝方式,再利用json.parse()將這個字串還原成乙個物件,達到了深拷貝的目的。

3、借用 jq 的 extend 方法實現深拷貝。

$.extend([deep], target, ...object);

deep表示深拷貝,boolean

target目標物件

...object需要進行合併的物件

本文是對於深淺拷貝的學習筆記整理記錄。感謝 聽風是風 博主的分享!

js實現深拷貝和淺拷貝

let obj let newobj obj.age.age 25 修改第二層的obj.age.age,newobj.age.age也會跟著變化 console.log newobj 複製 注意 資料的slice和concat方法也是淺拷貝,只能拷貝一層 原理 把乙個物件轉化成乙個字串,再把這個字串...

js實現深拷貝和淺拷貝

淺拷貝 思路 把父物件的屬性,全部拷貝給子物件,實現繼承。問題 如果父物件的屬性等於陣列或另乙個物件,那麼實際上,子物件獲得的只是乙個記憶體位址,不會開闢新棧,不是真正拷貝,因此存在父物件被篡改的可能。function deepcopy o for i in o return f 深拷貝 思路 遞迴...

js 深拷貝和淺拷貝區別,以及實現深拷貝的方法

定義 1.深拷貝 function deepcopy obj var obj say console.log deepcopy obj 注意 這種拷貝方法不可以拷貝一些特殊的屬性 例如正規表示式,undefine,function function deepcopytwo obj if obj ty...