js資料結構

2021-10-20 18:47:09 字數 1581 閱讀 8020

一、堆疊的概念

在計算機領域中,堆疊是兩種資料結構。

棧:佇列優先,先進先出;由作業系統自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

堆:先進後出;動態分配的空間 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os**,分配方式倒是類似於鍊錶。

二、js的資料型別

js的資料型別主要分為兩種:基本型別值和引用型別值。

基本型別值 有5種:undefined,null,boolean,number,string。這五種資料型別是按值訪問的,是存放在棧記憶體中的簡單資料段,資料大小確定,記憶體空間大小可以分配。

var str1 = 「i am string」,

num1 = 10,

bool1 = true,

u1 = undefined,

n1 = null;

//複製變數值

var str2 = str1,

num2 = num1,

bool2 = bool1,

u2 = u1,

n2 = n1;

//修改變數值

str2 = 「are you new」;

num2 = 20;

bool2 = false;

可以看到,基本型別值的複製是值的傳遞,賦值以後二者再無關聯,修改其中乙個不會影響另乙個。

引用型別值: 5種基本型別值以外的資料型別都可以看做是引用型別值,比如array,object等,是儲存在堆記憶體中的物件。js不允許直接訪問堆記憶體中的位置,也就是說不能直接操作物件的記憶體空間。在操作物件時,實際是在操作物件的引用而不是實際的物件,是按位址訪問的。

var obj1 = , arr1 = [2, 5, 6];

var obj2 = obj1,

arr2 = arr1;

//修改變數值

obj2.a = 「change value」;

arr1[1] = 48;

可以看到,直接傳遞引用類性值的時候,傳遞的只是引用,二者指向同一塊記憶體,所以修改其中乙個,必然會引起另乙個變數的變化。

在日常的使用中,我們把物件賦值給乙個變數時,通常希望得到的是乙個跟原物件無關的副本,修改新的變數不影響原物件,因此就有了淺拷貝和深拷貝。

三、淺拷貝和深拷貝

簡單的說,淺拷貝就是只將物件 最外層 的鍵值複製為乙個新的物件,而深拷貝則會 遞迴複製所有的層 ,直到該鍵的值為基本型別值。 再簡單點說 ,經過淺拷貝後,新舊變數可能還會有所關聯(既然說了是可能還有所關聯,那也可能毫無關聯吧,這裡的關鍵就在於原物件的複雜程度了);而經過深拷貝後,理論上,新舊變數再無關聯。 注意 ,在進行深拷貝時,層級不宜過多。所以,一般的深拷貝也並不是絕對毫無關聯的。

var obj = , obj1 = , //假裝這裡是個淺拷貝

obj2 = json.parse(json.stringify(obj)); //假裝這裡是深拷貝。

obj1.a = 「value a」;

obj1.arr[0] = 66;

可以看到,當原物件的值為 基本型別值 時,淺拷貝和深拷貝並沒有區別;而當原物件的某些值為 引用型別值 時,如果修改變數的值,淺拷貝會改變原物件的值,而深拷貝則不會。

js 資料結構

樹是電腦科學中經常用到的一種資料結構。樹是一種非線性的資料結構,以分層的方式儲存資料。二叉樹每個節點的子節點不允許超過兩個。乙個父節點的兩個子節點分別稱為左節點和右節點,通過將子節點的個數限定為2,可以寫出高效的程式在樹中插入 查詢和刪除資料。二叉查詢樹 bst 是一種特殊的二叉樹,相對較小的值儲存...

js資料結構 棧

棧是一種遵循後進先出 lifo 的資料結構,其總共就兩個主要的操作,分別是push和pop。看上面這張圖可以大致的知道,棧的幾個特點 push操作 pop操作 通過上面的幾個特點,來看一看js如何用 實現乙個棧 class stack push操作 push x push乙個新的資料,棧頂的指向也同...

js 資料結構 map Set

js 對空位的處理,已經很不一致了,大多數情況下會忽略空位。1.擴充套件運算子 spread 是三個點 console.log 1,2,3,4 5 function push array,items 陣列複製 const a1 1,2 const a2 a1.concat const a3 a1 c...