[toc]
## 聲明一個數組的方式有:
```javascript
var a = [];
var b = new Array(); // --> []
var c = new Array(6); // --> length為6的數組,每個元素都是undefined
var d = new Array(1,2,3); // --> [1,2,3]
```
## 還有不常見的稀疏數組, 數組中不連續,會有undefined存在
## 可以通過Object.defineProperty()讓數組的length屬性變成只讀的,如:
```javascript
var a= [1, 2, 3];
Object.defineProperty(a, 'length', {writable: false});
a.length = 1; //--> length屬性不會改變
```
## 數組的元素的增加和減少 posh pop shift unshift
```javascript
var a = [1, 2, 3];
a.push(4); //--> [1, 2, 3, 4]
a.pop(); //--> a = [1, 2, 3] ; pop 方法會刪除并返回最后一個元素,會改變原數組
a.shift(); //--> 和pop方法相同,不過是第一個元素
a.unshift(4); //--> 和push方法相同,從前面插入
```
## 數組的方法
- **splice**
splice方法 **刪除或者添加**數組元素 splice(a, b), 從第a個開始刪除b個元素,并返回刪除的元素或數組,會改變原來的數組
```javascript
var a = [1,2,3,4,5];
a.splice(0, 1); //--> 刪除第0個開始的1個元素
a; // --> [2,3,4,5]
```
```javascript
//如果省略第二個參數,后面的全刪除
var a = [1,2,3,4], b = ['a', 'b', 'c', 'd'];
a.splice(2); // --> 返回[3,4], a 為 [1, 2]
```
```javascript
//spilce除了刪除還能添加!!
var a = [1,2,3], b = ['a', 'b', 'c', 'd'];
a.splice(2,0, 'a', 'b'); //--> [1,2,'a', 'b', 3]
b.splice(2,1,[1,2], 'e') ; // --> 返回['c'], b為 ['a', 'b', [1,2], 'e', 'd']
```
- **concat**
合并兩個數組 a.concat(b) 并返回合并后的數組, 原數組不會改變
```javascript
var a = [1,2,3,4,5], b = [1, 2];
a.concat(b) ; //--> [1, 2, 3, 4, 5, 1, 2]
console.log(a); // --> [1, 2, 3, 4, 5]
console.log(b); // --> [1, 2] a b 數組都不會變
```
- **sort** 和 **reserve**
```javascript
var a = [{value: 2}, {value: 1}, {value: 5}, {value: 4}];
a.sort(function(obj1, obj2){
return obj1 - obj2; //正序-->[{value: 1}, {value: 2}, {value: 4}, {value: 5}];
})
```
- **join**
將數組中所有元素化為字符串并連接在一起,并返回生成的字符串。同時可以指定一個字符來作為連接符
```javascript
var a = [1,2,3];
//a.join(); -->'123'
//a.join(' '); --> '1 2 3'
//a.join('-'); --> '1-2-3'
```
- **slice**
返回元素或子數組, slice(a, b), 返回從第a個開始到第b個元素的集合, a和b可以是負數, 負數則從末尾開始算
```javascript
var a = [1, 2, 3, 4];
a.slice(0, 2); //[1, 2]
a.slice(0, -1); //[1, 2, 3]
```
- **forEach**
> forEach 方法遍歷整個數組,并對數組的每個元素執行方法, 可以傳遞3個參數: 元素 序列 數組本身
```javascript
var a = [1, 2, 3, 4],
b = 0;
a.forEach(
function(item, index, self){
b += item; //循環結束b=10
}
);
```
需要注意的是**forEach不能停止循環**,沒有for循環中的break語句。如果需要提前終止循環,**必須放在try塊中,并拋出異常**。拋出異常的時候會觸發**foreach.break** 事件
- **map**
> 將調用的數組的每個元素傳遞給指定的函數,并返回新的數組,包含該函數的返回值
```javascript
var a = [1, 2, 3, 4, 5];
var b = a.map(function(item){return item*2 }); //[2, 4, 6, 8, 10]
var c = [{val: 1}, {val: 2}, {val: 3}];
var d = c.map(function(i){return (i.val + 1)});//[2, 3, 4]
```
map遍歷和forEach 不一樣,map返回的是新數組,不會改變原數組
- **filter**
- **every和some**
> every和some是數組的判斷, 返回true或者false
如果一個數組的每個元素都滿足every中的函數,則返回true;而some只要有符合條件的就返回true。
**every相當于每個元素的 & , some 相當于 |**
```javascript
var a = [1, 2, 3, 4];
a.every(function(i){return i < 10}); //true
a.every(function(i){return i%2 == 0}); //false
```
```javascript
var b = [1, 2, 3, 4];
b.some(function(i){ return i < -1 }); //false
b.some(function(i){ return i % 2 === 0 }); //true
```
- **reduce和reduceRight**
> 化簡方法, 將數組進行組合,生成單個值并返回
## reduce從左, reduceRight從右開始。這兩個方法接收兩個參數,第一個參數是執行的方法,第二個參數是可選的初始值。有初始值時,初始值作為執行方法的第一個參數注入,沒有的話,則是數組的第一個元素或者最后一個作為初始值傳入。
```javascript
var a = [1,2,3];
var b = a.reduce(function(x, y){
return x+y
}, 0); //--> 6
```
- **indexOf和lastIndexOf**
> 檢索數組,并返回匹配的第一個元素的索引,indexOf從頭開始,lastIndexOf從尾開始,如果沒找到則返回-1。可以傳入兩個參數,第一個是需要匹配的元素,第二個是可選的,它是指定數組中的一個索引,從那開始搜索,第二個參數也可以是負數