與Java語言不同,JavaScript中的陣列有三個特性:
1.無型。數組的成員可以是任何類型,同一個數組也可以由許多不同類型的成員組成。
2.長度可變。陣列的長度是可以動態變化的,因此在JavaScript中不存在陣列存取的越界問題。
3.不連續性。數組中成員的位置可以是連續的(0, 1, 2, 3…),也可以是不連續的。任何數組都有一個名為length的屬性,在數組成員連續的情況下,length值與數組成員數目一致;當數組成員不連續時,length值要大於數組成員的數目。與連續的數組相比,不連續數組的讀寫性能差一些。
實驗:
從上面的例子可以看到,對於不連續的數組,當訪問到缺少的那個成員時,JavaScript將傳回undefined。如果陣列連續,但是其中某個成員為undefined,那麼存取陣列的結果是一樣的:
數組不連續、有成員缺失,跟數組連續、但有成員為undefined,這兩種情況下訪問數組內容所得到的結果是一樣的。但在這兩者之間還是存在一些細微的差別,主要表現在對數組key的存取:
可以看到,這兩種情況下雖然存取內容所得到的結果一致,但是其內部機制是完全不同的:在數組不連續的情況下,某個成員缺失,因此當訪問該成員時,JavaScript返回了undefined;在陣列連續的情況下,所有的成員都存在,只是某些成員的值比較特殊,為undefined而已。
從上面的例子也可以看到,JavaScript中的陣列究其本質只是以數字為key的物件而已,與普通的鍵值對物件沒有任何差別。事實上,在對數組進行讀取和寫入操作時,JavaScript會試圖將參數轉換為正整數,如果轉換成功則將進行數組操作(自動更新數組的length屬性),如果失敗則將參數轉換成字符串後進行普通物件的讀寫操作。當然,在JavaScrpt解釋器的實作中,針對數組的這種以數字作為key的特性作了很多性能優化,因此在實際使用過程中,如果對象的key都是數字,那麼直接使用數組對象會得到更加高效的結果。
在對陣列進行定義的過程中,JavaScript允許出現多餘的逗號,也允許兩個逗號間出現陣列成員的缺失:
對於數組的創建,JavaScript支援四種方法:
1.使用字面量(如上述幾個例子中的中括號表達式)來直接建立陣列物件。
2.使用Array()建構函數,不傳入任何參數。在這種情況下,將建立一個空數組,其效果與[]等同。
3.使用Array()建構函數,傳入一個正整數作為陣列的長度。在這種情況下,JavaScript將預留對應的記憶體空間來儲存這個陣列。值得注意的是,此時數組的key都是沒有被定義的,也即數組中沒有任何成員。其效果與[,,,,]這樣的寫法等同
4.使用Array()建構函數,傳入陣列的成員。
實驗:
var m = new Array(42, 33, 99, "test", {k:99});
console.log(m);//[42, 33, 99, "test", Object {k=99}]