## 數組
**1.數組簡介**
數組是值的有序集合。每個值叫做一個元素,而每個元素在數組中有一個位置,以數字表示(從0開始),稱為索引,整個數組用方括號表示。
```
var arr = [1,2,3];
```
除了在定義時賦值,數組也可以先定義后賦值。
```
var arr = [];
arr[0] =1;
```
數組元素可以是任意類型。
```
var arr = [1,'a',{name:'a'},function(){}];
```
上面數組arr的4個元素分別是數字,字符串,對象,函數。
數組屬于一種特殊的對象。
```
typeof [1]
// "object"
```
JavaScript語言規定,對象的鍵名一律為字符串,所以,數組的鍵名其實也是字符串。之所以可以用數值讀取,是因為非字符串的鍵名會被轉為字符串。
**2、創建數組**
**2.1 創建數組**
**(1)數組直接量**
使用數組直接量是創建數組最簡單的方法,在方括號中將數組元素用逗號隔開即可。
```
var arr = [1,2,3];
```
注:如果省略數組直接量的某個值,省略的元素將被賦予undefined值。
**(2)new Array()**
我們也可以調用構造函數Array()創建數組
```
var a=new Array();
var a2=new Array(10);
var a3=new Array(1,2,3,4);
```
上面的例子,a是一個空數組,a2是一個包含10個數組項但為undefined的數組,a3是包含4個數組項,并且分別有值。
**2.2 數組長度**
每個數組都有一個**length**屬性,返回數組的元素數量
```
[1,2,3].length //3
```
JavaScript使用一個32位整數,保存數組的元素個數。這意味著,數組成員最多只有4294967295個(232 - 1)個,也就是說length屬性的最大值就是4294967295。
只要是數組,就一定有length屬性。該屬性是一個動態的值,等于鍵名中的最大整數加上1.
length屬性是可寫的。如果人為設置一個小于當前成員個數的值,該數組的成員會自動減少到length設置的值。
```
var arr = [1,2,3]
arr.length //3
arr.length = 2;
arr //[1,2]
```
將數組清空的一個有效方法,就是將length屬性設為0。
```
var arr = [1,2,3];
arr.length = 0;
arr //[]
```
如果人為設置length大于當前元素個數,則數組的成員數量會增加到這個值,新增的位置都是空位。
```
var arr = [1];
arr.length=3;
arr[1] //undefined
```
在ECMAScript 5中,可以用Object.defineProperty() 讓數組的length屬性變成只讀。
**2.3 空位**
當數組的某個位置是空元素,即兩個逗號之間沒有任何值,我們稱該數組存在空位(hole)。
```
var arr = [1,,2]
arr.length //3
```
但是,如果最后一個元素后面有逗號,并不會產生空位。數組直接量的語法允許有可選的結尾的逗號,故[,,]只有兩個元素而非三個。
```
var arr = [,,];
arr.length //2
```
**2.4 數組元素的讀和寫**
使用([])操作符來訪問數組中的一個元素。
```
var arr = [1,2]
arr[0] //1
arr[1]=3; // [1,3]
```
**2.5 數組元素的添加和刪除**
可以使用push()方法在數組末尾添加一個或多個元素。
```
var arr = [1,2]
arr.push(3) // [1,2,3]
arr.push('a','b') //[1,2,3,'a','b']
// shift()是刪除數組的一個元素。
arr.shift() // [2,3,'a','b']
```
**2.6 稀疏數組**
稀疏數組是指包含從0開始的不連續索引的數組。通常,數組的length屬性值代表數組中元素的個數,但如果是稀疏數組,length屬性值大于元素的個數。
**2.7 多維數組**
JavaScript不支持真正的多維數組,但可以用數組的數組來近似。也可以說,數組里放數組。
```
var arr = [[1],[2,3]];
arr[0][0] // 1
arr[1][1] //3
```
**2.8 遍歷數組**
我們可以使用for循環、while循環、for..in或者forEach()方法來遍歷數組
```
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++;
}
//for..in
for (var i in a) {
console.log(a[i]);
}
//forEach
a.forEach(function(v){
console.log(v);
})
```
**2.9 類數組對象**
在JavaScript中,有些對象被稱為“類數組對象”。意思是,它們看上去很像數組,可以使用length屬性,但是它們并不是數組,無法使用一些數組的方法。
```
var o = {
0: 'a',
1: 'b',
length:2
}
o[0] // "a"
o[1] // "b"
o.length // 2
o.push('d') // TypeError: o.push is not a function
```
上面代碼中,變量o是一個對象,雖然使用的時候看上去跟數組很像,但是無法使用數組的方法。這就是類數組對象。
`類數組對象`有一個特征,就是具有length屬性。換句話說,只要有length屬性,就可以認為這個對象類似于數組。但是,對象的length屬性不是動態值,不會隨著成員的變化而變化。
由于類數組對象沒有繼承自Array.prototype,那就不能在它們上面直接調用數組方法。不過我們可以間接的使用Function.call方法調用。
```
var o = {
0: 'a',
1: 'b',
length:2
};
Array.prototype.slice.call(o) // ["a","b"]
```
典型的類似數組的對象是函數的arguments對象,以及大多數DOM元素集,還有字符串。
- 前言
- JavaScript簡介
- 基本概念
- 語法
- 數據類型
- 運算符
- 表達式
- 語句
- 對象
- 數組
- 函數
- 引用類型(對象)
- Object對象
- Array對象
- Date對象
- RegExp對象
- 基本包裝類型(Boolean、Number、String)
- 單體內置對象(Global、Math)
- console對象
- DOM
- DOM-屬性和CSS
- BOM
- Event 事件
- 正則表達式
- JSON
- AJAX
- 表單和富文本編輯器
- 表單
- 富文本編輯器
- canvas
- 離線應用
- 客戶端存儲(Cookie、Storage、IndexedDB)
- HTML5 API
- Video/Audio
- Geolocation API
- requestAnimationFrame
- File API
- FullScreen API
- IndexedDB
- 檢測設備方向
- Blob
- vibrate
- Luminosity API
- WebRTC
- Page Visibility API
- Performance API
- Web Speech
- Notification
- 面向對象的程序設計
- 概述
- this關鍵字
- 原型鏈
- 作用域
- 常用API合集
- SVG
- 錯誤處理機制
- JavaScript開發技巧合集
- 編程風格
- 垃圾回收機制