JS定義/建立陣列(兩種方式)

2020-07-16 10:05:05
JavaScript 定義(建立或者宣告)陣列的方法有兩種:構造陣列和陣列直接量。

構造陣列

使用 new 運算子呼叫 Array() 型別函數時,可以構造一個新陣列。

範例1

直接呼叫 Array() 函數,不傳遞引數,可以建立一個空陣列。
var a = new Array();  //空陣列

範例2

傳遞多個值,可以建立一個實陣列。
var a = new Array(1, true, "string", [1,2], {x:1,y:2});  //實陣列
每個引數指定一個元素的值,值得型別沒有限制。引數的順序也是陣列元素的順序,陣列的 length 屬性值等於所傳遞引數的個數。

範例3

傳遞一個數值引數,可以定義陣列的長度,即包含元素的個數。
var a = new Array(5);  //指定長度的陣列
引數值等於陣列 length 的屬性值,每個元素的值預設值為 undefined。

範例4

如果傳遞一個引數,值為 1,則 JavaScript 將定義一個長度為 1 的陣列,而不是包含一個元素,其值為 1 的陣列。
var a = new Array(1);
console.log(a[0]);

陣列直接量

陣列直接量的語法格式:在中括號中包含多個值列表,值之間用逗號分隔。

範例

下面程式碼使用陣列直接量定義陣列。
var a = [];  //空陣列
var a = [1, true, "0", [1,0], {x:1,y:0}];  //包含具體元素的陣列
推薦使用陣列直接量定義陣列,因為陣列直接量是定義陣列最簡便、最高效的方法。

空位陣列

空位陣列就是陣列中包含空元素。所謂空元素,就是在語法上陣列中兩個逗號之間沒有任何值。出現空位陣列的情況如下。
1) 直接量定義
var a = [1, , 2];
a.length;  //返回3
如果最後一個元素後面加逗號,不會產生空位,與沒有逗號時效果一樣。
var a = [1, 2, ];
a.length;  //返回2

2) 建構函式定義
var a = new Array(3);  //指定長度的陣列
a.length();  //返回3,產生3個空元素

3) delete 刪除
var a = [1, 2, 3];
delete a[1];
console.log(a[1]);  //undefined
console.log(a.length);  //3
上面程式碼使用了 delete 命令刪除了陣列的第 2 個元素,這個位置就形成了空位。

空元素可以讀寫,length 屬性不排斥空位。如果使用 for 語句和 length 屬性遍歷陣列,空元素都可以被讀取,空元素返回值為 undefined。
var a = [, , ,];
for (var i = 0; i < a.length; i++) {
    console.log(a[i]);  //返回3個undefined

空元素與元素的值為 undefined 是兩個不同的概念,即使空元素的返回值也是 undefined。JavaScript 在初始化陣列時,只有真正儲存有值得元素才可以分配記憶體。

使用 forEach() 方法、for/in 語句以及 Object.keys() 方法進行遍歷時,空元素都會被跳過,但是值為 undefined 元素,能夠被正常疊代。
var a = [, , undefined];
for (var i in a) {
    console.log(i);  //返回2,僅讀取了第3個元素
}
console.log(a.length);  //返回3,包含3個元素

關聯陣列

如果陣列的下標值超出範圍,如負數、浮點數、布林值、物件或其他值,JavaScript 會自動把它轉換為一個字串,並定義為關聯陣列。

關聯陣列就是與陣列關聯的物件,簡單的說就是陣列物件,字串下標就是陣列物件的屬性。

範例1

在下面範例中,陣列下標 false、true 將不會被強制轉換為數值 0、1,JavaScript 會把變數 a 視為物件,false 和 true 轉換的字串被視為物件的屬性名。
var a = [];  //宣告陣列
a[false] = false;
a[true] = true;
console.log(a[0]);  //返回undefined
console.log(a[1]);  //返回undefined
console.log(a[false]);  //返回false
console.log(a[true]);  //返回true
console.log(a["false"]);  //返回false
console.log(a["true"]);  //返回true

範例2

關聯陣列是一種資料格式,被稱為雜湊表。雜湊表的資料檢索速度要優於陣列。
var a = [["張三",1],["李四",2],["王五",3]];  //二維陣列
for (var i in a) {  //遍歷二維陣列
    if (a[i][0] == "李四") console.log(a[i][1]);  //檢索指定元素
}
如果使用文字下標會更為高效。
var a = [];  //定義空陣列
a["張三"] = 1;  //以文字下標來儲存元素的值
a["李四"] = 2;
a["王五"] = 3;
console.log(a["李四"]);  //快速定位檢索

範例3

物件也可以作為陣列下標,JavaScript 會試圖把物件轉換為數值,如果不行,則把它轉換為字串,然後以文字下標的形式進行操作。
var a = [];  //陣列直接量
var b = function () {  //函數直接量
    return 2;
}
a[b] = 1;  //把物件作為陣列下標
console.log(a.length);  //返回長度為0
console.log(a[b]);  //返回1
可以這樣讀取元素值。
var s = b.toString();  //獲取物件的字串
console.log(a[s]);  //利用文字下標讀取元素的值
還可以這樣設計下標,此時為陣列的元素,而不是關鍵屬性了。
a[b()] = 1;
console.log(a[2]);
console.log(a.length);

偽類陣列

偽類陣列,也稱為類陣列,即類似陣列結構的物件。簡單的說,就是物件的屬性名為非負整數,且從 0 開始,有序遞增,同時包含 length 屬性,還應確保其值與有序下標屬性個數保持動態一致,以方便對偽類陣列進行疊代操作。大家所熟知的 jQuery 物件就是一個偽類陣列。

範例

在下面範例中,obj 是一個物件直接量,當使用陣列下標為其賦值時,JavaScript 不再把它看作是陣列下標,而是把它看作物件的屬性名。
var obj = {};  //定義物件直接量
obj[0] = 0;
obj[1] = 1;
obj[2] = 2;
obj.length = 3;
console.log(obj["2"]);  //返回2
它相當於一個物件直接量。
var obj = {
    0 : 0,
    1 : 1,
    2 : 2,
    length : 3
};
由於數位是非法的識別符號,所以不能使用點語法來讀寫屬性。
console.log(obj.0);
而應該使用中括號語法來讀寫屬性。
console.log(obj["2"]);

存取陣列

陣列是複合型資料,陣列名稱是一個指向陣列的參照型變數,因此陣列屬於參照型物件。

存取陣列就是存取陣列元素。元素相當於變數,陣列的元素是一組有序排列的變數,它們沒有識別符號,以下標進行索引,下標從 0 開始,有序遞增。注意,陣列下標是非負整數型表示式,或者是字元型數位,不可以為其他型別的值或表示式。

使用中括號[]可以讀寫陣列。中括號左側是陣列名稱,中括號內為陣列下標。

陣列[下標表示式]

下標表示式是值為非負整數的表示式。

範例1

下面程式碼使用中括號為陣列寫入資料,然後再讀取陣列元素的值。
var a = [];  //宣告一個空陣列
a[0] = 0;  //為第一個元素賦值為0
a[2] = 2;  //為第三個元素賦值為2
console.log(a[0]);  //讀取第一個元素,返回值為0
console.log(a[1]);  //讀取第二個元素,返回值為undefined
console.log(a[2]);  //讀取第三個元素,返回值為2
在上面程式碼中僅為 0 和 2 下標位置的元素賦值,下標為 1 的元素為空,讀取時為空的元素返回值預設為 undefined。

範例2

下面程式碼使用 for 語句批次為陣列賦值,其中陣列下標是一個遞增表示式。
var a = new Array();
for (var i = 0; i < 10; i ++) {
    a[i ++] = ++ i;
}
console.log(a);

範例3

設計有兩個變數,不需要其他變數的幫助實現值互換。

一般情況下實現變數交換,需要定義一個臨時變數做中轉。
var a = 10, b = 20;  //變數初始化
var temp = a;  //定義臨時變數儲存a
a = b;  //把b的值賦值給a
b = temp;  //把臨時變數的值賦值給b
利用陣列就可以這樣設計。
var a = 10, b = 20;  //變數初始化
a = [b, b = a][0];  //通過陣列快速交換資料

設計技巧

陣列的元素允許使用表示式,表示式的值與元素的值是兩個不同的概念,本質上元素也是一個變數,識別符號是下標編號。在一個匿名陣列中,把變數 b 的值傳遞給第 1 個元素,然後在第 2 個元素中以賦值表示式運算的方式把變數 a 的值賦值給變數 b,再把變數 b 的值傳遞給第 2 個元素。這個過程是按順序執行的,變數 b 的值被重寫,同時陣列也被新增了兩個元素,最後使用中括號語法讀取第 1 個元素的值,並賦值給變數 a,從而實現值互換。