【JavaScript基礎筆記】陣列
陣列由於陣列成員的鍵名是固定的(預設總是0、1、2…),因此陣列不用為每個元素指定鍵名。陣列的鍵名等同於物件的鍵名,必須為字串。
只要是陣列,就一定有length
屬性。該屬性是一個動態的值,等於鍵名中的最大整數加上1
。
arr.0
的寫法不合法,因為單獨的數值不能作為識別符號(identifier)。所以,陣列成員只能用方括號arr[0]
表示(方括號是運算子,可以接受數值)。
JavaScript 使用一個32位整數,儲存陣列的元素個數。這意味著,陣列成員最多隻有 4294967295 個(232 - 1)個,也就是說length
屬性的最大值就是 4294967295。
遍歷
for...in
所以推薦用for或者while遍歷陣列
var a = [1, 2, 3]; // for迴圈 for(var i = 0; i < a.length; i++) { console.log(a[i]); }
// while迴圈
var i = 0; while (i < a.length) { console.log(a[i]); i++; } var l = a.length; while (l--) { console.log(a[l]); }
陣列的forEach
方法,也可以用來遍歷陣列。
var colors = ['red', 'green', 'blue']; colors.forEach(function (color) { console.log(color); }); // red // green // blue
空位
當陣列的某個位置是空元素,即兩個逗號之間沒有任何值,我們稱該陣列存在空位(hole)。
陣列的空位是可以讀取的,返回undefined
。
使用delete
命令刪除一個數組成員,會形成空位,並且不會影響length
屬性。
也就是說,length
屬性不過濾空位。所以,使用length
屬性進行陣列遍歷,一定要非常小心。
陣列的某個位置是空位,與某個位置是undefined
,是不一樣的。如果是空位,使用陣列的forEach
方法、for...in
結構、以及Object.keys
方法進行遍歷,空位都會被跳過。
這就是說,空位就是陣列沒有這個元素,所以不會被遍歷到,而undefined
undefined
,所以遍歷不會跳過。
類似陣列的物件
如果一個物件的所有鍵名都是正整數或零,並且有length
屬性,那麼這個物件就很像陣列,語法上稱為“類似陣列的物件”(array-like object)。
上面程式碼中,物件obj
就是一個類似陣列的物件。但是,“類似陣列的物件”並不是陣列,因為它們不具備陣列特有的方法。物件obj
沒有陣列的push
方法,使用該方法就會報錯。
“類似陣列的物件”的根本特徵,就是具有length
屬性。只要有length
屬性,就可以認為這個物件類似於陣列。但是有一個問題,這種length
屬性不是動態值,不會隨著成員的變化而變化。
典型的“類似陣列的物件”還有函式的arguments
物件,以及大多數 DOM 元素集,還有字串。
陣列的slice
方法可以將“類似陣列的物件”變成真正的陣列。
var arr = Array.prototype.slice.call(arrayLike);
除了轉為真正的陣列,“類似陣列的物件”還有一個辦法可以使用陣列的方法,就是通過call()
把陣列的方法放到物件上面。
function print(value, index) { console.log(index + ' : ' + value); } Array.prototype.forEach.call(arrayLike, print);
上面程式碼中,arrayLike
代表一個類似陣列的物件,本來是不可以使用陣列的forEach()
方法的,但是通過call()
,可以把forEach()
嫁接到arrayLike
上面呼叫。
上述筆記引用自——阮一峰《JavaScript 標準參考教程(alpha)》