ECMAScript數組與其他語言中的數組都是數據的有序列表,但與其他語言不同的是,ECMAScript數組的每一項可以保存任何類型的數據。而且ECMAScript數組的大小是可以動態調整的,即可以隨著數據的添加自動增長。
創建數組的基本方式有兩種:
第一種是使用Array構造函數:
//1. 使用Array構造函數 var colors = new Array();//2.如果預先知道數組要保存的項目數量,也可以給構造函數傳遞該數量,改數量會自動變成length的屬性值 var colors2 = new Array(20); alert(colors2.length); //20//3.也可以向Array構造函數傳遞數組中應該包含的項。 var colors3 = new Array("red", "blue", "green");//4.給構造函數傳遞一個值時,如果傳遞的是數值,表示該數組的長度。如果傳遞的是其他類型,則會創建包含那個值的數組 var colors4 = new Array(3); // 創建一個包含3項的數組 var colors5 = new Array("Greg"); //創建一個包含1項的數組//5. 在使用Array構造函數時也可以省略new操作符 var colors6 = Array(3); var names = Array("Greg");
第二種是使用數組字面量表示法: 數組字面量是由一對包含數組項的方括號表示,多個數組項之間以逗號隔開
var colors = ["red", "blue", "green"]; //創建一個包含三個字符串的數組 var names = []; //創建一個空數組//在讀取和設置數組的值時,要使用方括號并提供相應值的基于0的數字索引 alert(colors[0]); //red colors[2] = "black"; colors[3] = "brown"; //索引大于數組項時,自動增加一個 alert(colors.length); //4 colors[99] = "black"; alert(colors.length); //100
1.檢測數組
instanceof :
Array.isArray(): 確定某個值是否為數組
if(Array.isArray(colors)){alert("yes"); }
2.轉換方法
toString() 方法: 返回由數組中每個值的字符串形式拼接而成的一個以逗號分隔的字符串。
valueOf() 方法: 返回的還是數組。
var colors = ["red", "blue", "green"]; //創建一個包含三個字符串的數組 alert(colors.toString()); //red,blue,green alert(colors.valueOf()); //red,blue,green alert(colors); //red,blue,green
上述代碼顯示的調用了toString()和valueOf()方法,以便返回數組的字符串表示,每個值的字符串表示拼接成了一個字符串,中間以逗號隔開。最后一行代碼直接將數組傳遞給了alert()。由于alert()要接收字符串參數,所以它會在后臺調用toString()方法,由此會得到與直接調用toString()方法相同的結果。
數組繼承的toLocaleString()、toString()和valueOf()方法,在默認情況下都會以逗號分隔的字符串形式返回數組項,如果使用join()方法,則可以使用不同的分隔符來構建這個字符串。join()方法只接收一個參數,即分隔符的字符串。
var colors = ["red", "blue", "green"]; //創建一個包含三個字符串的數組 alert(colors.join("||")); //red||blue||green
3. 棧方法
ECMAScript數組也提供了一種讓數組的行為類似其他數據結構的方法。
棧是一種LIFO(Last-In-First-Out)的數據結構。也就是最新添加的項最早被移除。棧中項的插入(推入)和移除(彈出),只發生在一個位置上--- 棧的頂部。
push() 方法: 可以接受任意數量的參數,把它們逐個添加到數組的末尾,并返回修改后數組的長度。
pop() 方法: 從數組末尾移除最后一項,減少數組的length值,然后返回移除的項。
var colors = ["red", "blue"]; var count = colors.push("green"); alert(count); //3 count = colors.push("black"); alert(count); //4var item = colors.pop(); alert(item); //black
4. 隊列方法
隊列數據結構的訪問規則是FIFO(First-In-First-Out)。隊列在列表的末端添加項,從列表的前端移除項。
push() 方法: 向數組末尾中添加項。
shift() 方法: 移除數組中的第一項并返回該項。
unshift() 方法: 在數組前端添加任意項并返回新數組的長度。
var colors = new Array(); var count = colors.push("red", "green"); alert(count); //2 count = colors.push("black"); alert(count); //3var item = colors.shift(); alert(item); //red count = colors.unshift("summer", "chen"); alert(count); //4 alert(colors); //summer,chen,green,black
5.重排序方法
數組中已經存在兩個可以直接用來排序的方法:
reverse() 方法: 反轉數組項的順序
sort(): 方法:在默認情況下,按升序排列數組項。sort()方法會調用每個數組項的toString()轉型方法,然后比較得到的字符串。
var values = [0, 1, 3, 15, 5, 10]; values.reverse(); alert(values); //10,5,15,3,1,0 values.sort(); alert(values); //0,1,10,15,3,5
sort()方法可以接收一個比較函數作為參數。
比較函數接收兩個參數,如果第一個參數應該位于第二個之前——返回一個負數;兩個參數相等——返回0;第一個參數該位于第二個之后——返回一個正數。
function compare(value1, value2){if(value1 < value2){return -1;}else if(value1 == value2){return 0;}else{return 1;} } var values = [0,15,10,5,1]; values.sort(compare); alert(values); //0,1,5,10,15
對于數值類型 或 其valueOf()方法會返回數值類型的對象類型,可以使用下列方法:
function compare(value1, value2){return value2 - value1; } var values = [0,15,10,5,1]; values.sort(compare); alert(values); //0,1,5,10,15
6.操作方法
concat() 方法: 基于當前數組中的所有項創建一個新數組。具體來說,這個方法會先創建當前數組的一個副本,然后講接收到的參數添加到這個副本的末尾,最后返回新構建的數組。在沒有給concat()方法傳遞參數的情況下,它只是復制當前數組并返回副本。如果傳遞給concat()方法的是一或多個數組,則該方法會將這些數組中的每一項都添加到結果數組中。如果傳遞的值不是數組,這些值就會簡單的添加到結果數組的末尾。
var colors = ["red", "green", "blue"]; var colors2 = colors.concat("yellow", ["black", "brown"]);alert(colors); //red,green,blue alert(colors2); //red,green,blue,yellow,black,brown
slice() 方法: 基于當前數組中的一個或多個項創建一個新數組。slice()方法可以接受一個或兩個參數,即要返回項的起始和結束的位置。slice方法不會影響原始數組。
var colors = ["red", "green", "blue", "black", "brown"];//1. 在只有一個參數的情況下,slice方法返回從該參數位置開始到當前數組末尾的所有項 var colors2 = colors.slice(1); alert(colors2); //green,blue,black,brown//2.有兩個參數,該方法返回起始位置和結束位置之間的項,不包括結束位置的項 var colors3 = colors.slice(1,3); alert(colors3); //green,bluevar colors4 = colors.slice(3,1); alert(colors4); //空數組var colors5 = colors.slice(1,1); alert(colors5); //空數組var colors6 = colors.slice(5); alert(colors6); //空數組var colors7 = colors.slice(3, 15); alert(colors7); //black,brown
splice()方法:主要用途是向數組中部插入項。改方法返回被刪除的項。
var colors = ["red", "green", "blue", "black", "brown"];//1. 刪除: 可以刪除任意數量的項,只需指定第一項的位置和要刪除的項數。返回被刪除的項 var colors2 = colors.splice(1,3); alert(colors2); //green,blue,black alert(colors); //red, brown//2.插入:提供三個參數:起始位置、0(要刪除的項數)、要插入的項 var colors3 = colors.splice(1,0, "summer", "holiday"); alert(colors); //red,summer,holiday,brownvar colors4 = colors.splice(-1,0, "summer", "holiday");//起始位置小于0時,按0計算 alert(colors); //red,summer,holiday,summer,holiday,brownvar colors5 = colors.splice(10,0, "summer", "holiday");//起始位置大于數組長度時,按數組長度計算 alert(colors); //red,summer,holiday,summer,holiday,brown,summer,holiday alert(colors.length); //8//3.替換:可以向指定位置插入任意數量的項,且同時刪除任意數量的項,三個參數:起始位置,要刪除的項數,要插入的項 var colors6 = colors.splice(1, 4, "green", "blue", "black"); alert(colors6); //summer,holiday,summer,holiday alert(colors); //red,green,blue,black,brown,summer,holiday
7. 位置方法
ECMAScript提供了兩個位置方法,這兩個方法都接收兩個參數,要查找的項和查找起點位置的索引(可選的)
indexOf() 方法: 從數組的開頭(位置0)開始向后查找。
lastIndexOf() 方法:從數組的末尾開始向前查找。
var numbers = [1,2,3,4,5,4,3,2,1];alert(numbers.indexOf(4)); //3 alert(numbers.lastIndexOf(4));//5 alert(numbers.indexOf(4,4));//5 alert(numbers.lastIndexOf(4,4));//3 alert(numbers.indexOf(6));//-1 alert(numbers.lastIndexOf(6));//-1var person = {name: "Nicholas"}; var people = [{name: "Nicholas"}];var morePeople = [person];alert(people.indexOf(person)); //-1 alert(morePeople.indexOf(person));//0
8. 迭代方法
ECMAScript為數組定義了5個迭代方法。每個方法都接收兩個參數: 每一項上運行的函數和運行該函數的作用域對象(可選的)--影響this值。
傳入這些方法中的函數接收三個參數:數組項的值、該項在數組中的位置、數組對象本身
every() 方法:? 對數組中的每一項運行給定函數,如果該函數對每一項都返回true,則返回true
filter() 方法: 對數組中的每一項運行給定函數,返回該函數會返回true的項組成的數組
forEach() 方法:對數組中的每一項運行給定函數,該函數沒有返回值
map() 方法:對數組中的每一項運行給定函數,返回每次函數調用的結果組成的數組
some() 方法:? 對數組中的每一項運行給定函數,如果該函數對任一項返回true,則返回true
var numbers = [1,2,3,4,5,4,3,2,1];var everyResult = numbers.every(function(item, index, array){return (item > 2);}); alert(everyResult); //falsevar someResult = numbers.some(function(item, index, array){return (item > 2);}); alert(someResult); //truevar filterResult = numbers.filter(function(item, index, array){return (item > 2);}); alert(filterResult); // 3,4,5,4,3var mapResult = numbers.map(function(item, index, array){return (item + 2);}); alert(mapResult); //3,4,5,6,7,6,5,4,3
9.縮小方法
ECMAScript有兩個縮小數組的方法。這兩個方法都會迭代數組的所有項,然后構建一個最終返回的值。這兩個方法都接收兩個參數,在每一項上調用的函數和作為縮小基礎的初始值。
傳入這些方法的函數接收四個參數:前一個值、當前值、項的索引、數組對象。這個函數返回的任何值都會作為第一個參數自動傳給下一項。第一次迭代發生在數組的第二項上,因此第一個參數是數組的第一項,第二個參數就是數組的第二項。
reduce() 方法: 從數組的第一項開始,逐個遍歷
reduceRight() 方法: 從數組的最后一項開始,向前遍歷到第一項
var values = [1,2,3,4,5]; var sum = values.reduce(function(prev, cur, index, array){return prev + cur;}); alert(sum); //15 var sum2 = values.reduceRight(function(prev, cur, index, array){return prev + cur;}); alert(sum2); //15
?