1. 程式人生 > >【JavaScript基礎筆記】陣列

【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)》