數組是數據的有序列表。
JS中的數組每一項都能保存任何類型的數據。
JS數組的大小是可以動態調整的,即可以隨着數據的添加自動增長以容納新增的數據。
創建數組的方式
第一種方式,使用Array構造函數。
var colors = new Array(); //創建一個空數組
var colors = new Array(3); //指定數組包含3項
var colors = new Array("red","green","blue"); //創建一個包含3項的數組
第二種方式,使用數組字面量表示法。
var colors = []; //創建一個空數組
var colors = ["red","green","blue"]; //創建一個包含3項的數組
多個數組項之間用逗號隔開,最后一項后面不要添加逗號。
通過數組字面量表示法定義數組時,不會調用Array構造函數。
length屬性
數組的length屬性不是只讀的,通過設定length屬性的值,可以移除某些項或者添加新項(新項的值為undefined)。
colors[colors.length] = "black"; //在數組末尾添加新項
colors[9] = "white";
colors.length //10 5-8項都是undefined
檢測某個對象是不是數組
一個全局執行環境 alert(array instanceof Array); //true
多個全局執行環境 alert(Array.isArray(array)); //true
轉換方法
數組的toString()方法,返回的是一個字符串;數組中的每一項的字符串表示拼接起來,中間以逗號分割;
數組的valueOf()方法,返回的是一個數組;
alert()接收字符串參數,實際上會在后台調用數組的每一項的toString()方法,所以返回的值與調用toString()方法返回的值一樣。
一般而言,toLocaleString()方法返回的值與toString()方法與valueOf()方法返回的值相同,但不總是這樣,當顯式地定義toLocaleString()方法和toString()方法,並設置不同的返回值時,這兩個方法返回的值當然是不一樣的。
例子:
var x = {
toString: function() {
return "black";
},
toLocaleString: function() {
return "black";
}
};
var y = {
toString: function() {
return "white";
},
toLocaleString: function() {
return "#fff";
}
};
var z = [x,y];
alert(z.toString()); //black,white
alert(z.toLocaleString()); //black,#fff
默認情況下,toLocaleString()方法、toString()方法、valueOf()方法返回的字符串以逗號分隔;可以用join()方法自定義分隔符;
join()方法接收一個參數,即用作分隔符的字符串,並返回一個包含所有數組項的字符串。
如果數組中某一項的值是null或者undefined,那么該值在toLocaleString()方法、toString()方法、valueOf()方法、join()方法返回的結果中以空字符串表示。
棧方法
棧是一種LIFO(Last-In-First-out,后進先出)的數據結構,也就是最新添加的項最早被移除。
棧中項的添加(推入)和移除(彈出),只發生在棧的頂部。
JS為數組提供了push()和pop()方法,實現類似棧的行為。
push()方法可以接收任意數量的參數,並把它們逐個添加到數組末尾,並返回修改后的數組的長度。
pop()方法從數組末尾移除最后一項,減少數組的length值,並返回移除的項。
隊列方法
隊列數據結構的規則是FIFO(First-In-First-Out,先進先出),隊列在數組的末端添加項,在數組的前端移除項。
shift()方法,移除數組的第一項,減少數組的length值,並返回移除的項。
unshift()方法,在數組前端添加任意個項,並返回修改后的數組的長度。
重排序方法
reverse()方法,反轉數組項的順序。
sort()方法
在默認情況下,sort()方法按照升序排列數組項;sort()方法會調用數組的toString()方法,然后比較得到的字符串。
sort()方法可以接收一個比較函數作為參數。
比較函數接收兩個參數:如果第一個參數應該位於第二個參數之前則返回一個負數;如果第一個參數應該位於第二個參數之后則返回一個正數;如果兩個參數相等則返回0。
例子:比較函數,升序排列:
var compare = function(value1,value2) {
if (value1<value2) {
return -1;
} else if (value1>value2) {
return 1;
} else {
return 0;
}
};
var y = [1,3,2,4,5];
alert(y.sort(compare)); //1,2,3,4,5
alert(y.sort(compare).reverse()); //5,4,3,2,1
對於數值類型或者其valueOf()方法會返回數值類型的對象類型,可以使用一個更簡單的比較函數。
升序:
function compare(value1,value2) {
return value1-value2;
};
操作方法
concat()方法,創建當前數組中所有項的一個副本,然后將接收到的參數添加到這個副本的末尾,最后返回新建的數組。 //不影響原始數組,最后返回的是一個新數組。
slice()方法,基於當前數組中的一個或多個項創建一個新的數組;接收兩個參數,起始位置(包含在內)和結束位置(不包含在內)。 //不影響原始數組。
如果slice()方法的參數中有負數,則用數組的長度加上負數以確定相應的起始和結束位置;如果結束位置小於起始位置,則返回一個空數組。
splice()方法 //改變原始數組
刪除:可以刪除任意數量的項;接收兩個參數,起始位置、刪除的項數; //返回刪除的項。
插入:可以插入任何數量的項;接收三個參數,起始位置、0(刪除的項數)、插入的項; //返回空數組。
替換:可以替換任意數量的項;接收三個參數,起始位置、刪除的項數、插入的項;刪除的項與插入的項不必相等。 //返回刪除的項。
位置方法
indexOf()方法,從數組的開始位置向后查找;
lastIndexOf()方法,從數組的末尾向前查找;
接收兩個參數,查找的項、(可選)查找起點位置的索引;返回查找的項在數組中的位置。
例子:
var x = [1,2,3,4,5,4,3,2,1];
alert(x.indexOf(4)); //從前往后找,第一個“4”,下標為3,返回 3 ;
alert(x.lastIndexOf(4)); //從后往前找,第一個“4”,下標為5,返回 5 ;
alert(x.indexOf(4,4)); //從下標為"4"的項開始往后找,返回5;
alert(x.lastIndexOf(4,4)); //從下標為"4"的項開始往前找,返回3;
迭代方法
every()方法,對數組中的每一項都運行給定函數,如果該數組中的每一項都返回true,則返回true;
some()方法,對數組中的每一項都運行給定函數,如果該數組中有任何一項返回true,則返回true;
filter()方法,對數組中的每一項都運行給定函數,返回該數組中返回true的項;
map()方法,對數組中的每一項都運行給定函數,返回每一項運行函數后的結果;
forEach()方法,對數組中的每一項都運行給定函數,沒有返回值。
這些方法接收兩個參數:給定的函數、(可選)運行該函數的作用域對象——影響this的值。
其中函數接收三個參數:數組項的值,數組項的索引,數組對象本身。
例子:
var x = [1,2,3,4,5,4,3,2,1];
var y = x.filter(function(item,index,array){
return (item>3);
});
alert(y); //4,5,4
歸並方法
reduce()方法;
reduceRight()方法;
迭代數組中的所有項,然后構建一個最終返回的值。
這兩個方法都接收兩個參數:在每一項上都調用的函數、(可選)作為歸並基礎的初始值。
其中函數接收四個參數:前一個值、當前的值、項的索引、數組對象本身。
這個函數返回的任何值都會作為第一個參數傳給下一項。
例子:
var x = [1,2,3,4,5];
var y = x.reduce(function(pre,cur,index,array){
return (pre*cur);
});
alert(y);