JavaScript之Array類型(數組)
1. 介紹
1.1 定義
//第一種方法:通過建構函式 Array //註:可以省略 new 關鍵字var colors = new Array();var colors = new Array(20);var colors = new Array();//第二種方法:數組字面量var colors = [];var colors = ["blue","black","green"];
1.2 使用和賦值
var colors = ["blue","black","green"];alert(colors[0]); //使用colors[2] = "black"; //賦值colors[3] = "brown"; //新增
1.3 length屬性
length屬性不是唯讀。\
通過設定此屬性可以從數組的末尾添加或刪除項,新增的項預設為undefined\
利用length屬性可以方便的向數組的末尾添加項。
var colors = ["blue","black","green"];colors[colors.length] = "black";colors[colors.length] = "brown";colors[99] = "white";alert(colors.length); //100
2. 檢測數組:Array.isArray()
使用instanceof操作符的問題在於它是假定只有一個全域執行環境。如果項目中使用了多個架構,就存在兩個以上的全域執行環境,從而存在兩個以上版本的Array建構函式。\
為瞭解決這個問題,ECMASsript5新增了Array.isArray()。這個方法的目的是最終確定某個值到底是不是數組。
var bool = value instanceof Array;var bool = Array.isArray(value);
3. 轉換方法:toLocaleString()、toString()、valueOf()、join()
JS中每個對象都有轉換方法:toLocaleString()、toString()和valueOf()方法。
- toString() 返回由數組中每個值得字串形式拼接而成的一個以逗號分隔的字串,為了建立這個字串,會調用每一項的toString()方法;
- toLocaleString() 返回由數組中每個值得字串形式拼接而成的一個以逗號分隔的字串,為了建立這個字串,toLocaleString()方法;
- valueOf() 返回的還是數組;
- join() 可以使用不同的分隔字元來構建數組字串; 4.添加刪除:push()、pop()、shift()、unshift() push() :末尾添加 pop() :末尾刪除 shift():前端移除 unshift():前端添加 棧 :後進先出 (LIFO),棧中項的操作只發生在一個位置——棧的頂部。可使用push()、pop()實現。 隊列:先進先出 (FIFO),末尾添加、前端移除。可使用push()、shift()實現。 5.重排序方法:reverse()、sort() reverse():反轉 sort():排序\
傳回值是排序後的數組
最簡單的例子:var array = [1,2,3,4,5];var first = array.reverse(); //[5,4,3,2,1]var second = first.reverse(); //[1,2,3,4,5]
在上面的例子,reserse()方法直觀明了,但不夠靈活,不能滿足我們自訂定序的需求。因此才有了sort()方法。sort()方法預設按照升序排列。為了實現排序,該方法會自動調用每個數組項的toString()方法,比較字串進行排序。如:
var array = [0,1,5,10,15];var result = array.sort(); //[0,1,10,15,5]//在這裡會得到以外的結果,因為並不是按照數字比較的
sort()方法強大之處在於其可以接受一個比較函數作為參數,從而實現我們自訂定序。比較函數接收兩個參數,表示的是數組中的兩項,暫用a,b表示,如果a應該位於b之前,則返回一個負數(表示不用交換位置);如果a應該位於b之後,則返回一個正數(表示需要交換位置);如果a等於b,則返回0。例:
//比較方法function compare(a,b){ if(a<b){ return -1; } else if(a>b){ return 1; } else { return 0 }}//使用以上比較方法實現升序var array = [0,1,5,10,15];var result = array.sort(compare); //[0,1,5,10,15]
通過以上形式,可以實現更複雜的排序效果。 6.操作方法:concat()、slice()、splice() concat():合并數組,不影響原數組\
concat()方法會先建立當前數組的一個副本,然後將接收到的參數添加到副本的末尾,最後返回建立的數組。
var colors1 = ['red','green'];
var colors2 = colors1.concat('yellow',['blue','black']);
//colors2 = ['red','green','yellow','blue','black']
slice():剪下數組,不影響原數組\
slice()基於當前數組的一個或多項組建新數組。接受一個或者兩個參數.
var colors1 = ['red','green','yellow','blue','black'];//若只有一個參數,則返回從該參數指定位置到結束位置之間項的數組var colors2 = colors1.slice(1); //['green','yellow','blue','black']//若有兩個參數,則返回第一個參數指定位置項至第二個參數指定項(不包含)之間的項的數組var colors3 = colors1.slice(1,4); //['green','yellow','blue']//若參數中有負數,則用數組長度加上該參數確定位置var colors4 = colors1.slice(-4,-1); //['green','yellow','blue']//若第二個參數小於第一個參數,則返回空數組var colors5 = colors1.slice(2,1); //[]
splice():剪接(刪除、插入、替換),對原數組操作\
使用splice可以實現對原數組的刪除、插入、替換操作,始終返回一個數組,該數組中包含從原始數組中刪除的項。 刪除:接收兩個參數:要刪除的第一項位置和要刪除的項數; 插入:接收三個以上參數:起始位置、0(要刪除的項數)、要插入的項; 替換:接收三個以上參數:起始位置、要刪除的項數、要插入的項;
var colors = ['red','green','yellow','blue','black'];//刪除var removed = colors.splice(0,1); //['red']//colors = ['green','yellow','blue','black']//插入var removed = colors.splice(1,0,'white','orange'); //[]//colors = ['green','white','orange','yellow','blue','black']//替換var removed = colors.splice(1,1,'red'); //['white']//colors = ['green','red','orange','yellow','blue','black']
7.位置方法:indexOf()、lastIndexOf()
EXMAScript增加了兩個位置方法。這兩個方法都接收兩個參數:要尋找的項和開始尋找的位置索引。傳回值是要尋找的項在數組中的位置,沒找到返回-1.在尋找的過程中使用全等操作符。
- indexOf() 正序
- lastIndexOf() 反序
```var number = [1,2,3,4,5,4,3,2,1];alert number.indexOf(4); //3alert number.lastIndexOf(4); //5alert number.indexOf(4,4); //5alert number.lastIndexOf(4,4); //3```
8.迭代方法:every()、filter()、forEach、map()、some()
5個迭代方法,都接收兩個參數:要在每一項上啟動並執行函數和運行該函數的範圍對象(影響this)。傳入的函數接收三個參數:當前數組項的值,該項在數組中位置,數組本身。
- every() :對數組中每一項運行給定函數,若結果全都是true,則返回true;
- some() :對數組中每一項運行給定函數,有一項結果為true就返回true;
- filter() :對數組中每一項運行給定函數,返回結果為true的數組項組合的新數組;
- forEach() :對數組中每一項運行給定函數,沒有傳回值;
- map() :對數組中每一項運行給定函數,返回每一項的運行結果數組;\
以上方法都不會修改原數組
```var number = [1,2,3,4,5,4,3,2,1];var everyResult = number.every(function(item,index,array){ return (item>2);}); //falsevar someResult = number.some(functon(item,index,array){ return (item>2);}); //truevar filterResult = number.filter(function(item,index,array){ return (item>2);}) //[3,4,5,4,3]var mapResult = number.map(function(item,index,array){ return (item*2);}); //[2,4,6,8,10,8,6,4,2]//forEach方法沒有傳回值number.forEach(function(item,index,array){ //執行操作});```
9.歸併方法:reduce()、reduceRight()
ECMAScript5新增方法。這兩個方法都會迭代數組所有項,構建一個最終傳回值。接受兩個參數:一個在每一項上調用的函數和作為歸併基礎的初始值。其中接受的第一個參數是函數,它接收4個參數:==前一個值,當前值,項索引,數組對象==;這個函數返回的任何值都會作為第一個參數自動傳給下一項.兩個函數執行方向不同,除此之外完全相同。
- reduce() 正序
- reduceRight() 反序
“`
//數組求和:
var number = [1,2,3,4,5];
var sum = number.reduce(function(prev, cur, index, array){
return prev + cur;
}); //15
var sum = number.reduceRight(function(prev, cur, index, array){ return prev + cur;}); //15```