1. 程式人生 > 其它 >關於js中的兩種陣列型別 看不見的陣列優化

關於js中的兩種陣列型別 看不見的陣列優化

1. js中的Array和Object有什麼區別

  這個問題要是沒有對c++中的陣列在記憶體中排列方式以及查詢方式有一定了解  一定會模模糊糊的。首先你要明白什麼叫陣列 什麼叫Object

       陣列和Object的區別

          在C++中 陣列是指在記憶體中按照一定次序指定開闢的一段擁有固定大小的一個個小格子 先確定空間 在朝裡面裝東西
          Object裝的是引索,是一個個棧記憶體中的變數對標著一個堆記憶體中的一塊記憶體空間(這個空間是隨著物件大小變化的)

       (ps : 先別急著理解為什麼我這裡要提到c++, 後面會說的)

 

     陣列和Object的find(查詢)方式

      陣列:根據上面的描述我們可以知道,陣列是按照固定大小排序的一段連續記憶體空間,換句話說  假設總陣列記憶體是 100 確定總房間(length)有10個  那麼 每一個房間就是固定的10個單位大小,換句話說  第一個房間就是 0-10  11-20  21-30 一次排列 查詢的時候直接按照這個規則定位記憶體空間片段就好了

      Object: 根據上面的定義,可以知道,Object的查詢時直接獲取引索,從引索得知 這個物件在記憶體空間中的位置為 x-y  然後去記憶體中獲取二進位制片段,返回;

        

     陣列和Object的迭代(遍歷)方式

      陣列:首先陣列本身就自帶一個x-y的總體空間大小,獲取每個格子的固定演算法為   (y-x)/length*index

         Object: 因為引索和物件分別在棧 堆記憶體中,查詢過程中要不斷的互相訪問切換 獲取儲存查詢返回

 

2. Js中的兩種陣列型別

  Js中的陣列為什麼可以隨意的push任意型別 無論是字串還是Object 都可以放一起,這樣不是違背了C++固定空間排序的規則了嗎?   

      兩種型別的陣列

         平時大家建立陣列都是

       var a = [];

       如果連續新增同樣型別的資料,那麼,這個物件的模式就是傳統的C++ Array物件模式  
      a.push(number);
      但是 一旦出現不一樣的型別 或者傳入的不能確定的型別
      a.push(Object) 
      原來的Array會變成雜湊陣列(HashTable) 就是滿陣列

 

     陣列的優化

        根據上面說的總結下來,可以瞭解到,更高效的陣列查詢一定是同類型的Array陣列,當大量的Object陣列需要查詢的時候,應該有意識的儲存一個key(String)陣列儲存出來, 用來查詢;