JavaScript之?dāng)?shù)組(Array)詳解
來源:易賢網(wǎng) 閱讀:896 次 日期:2015-04-02 15:55:15
溫馨提示:易賢網(wǎng)小編為您整理了“JavaScript之?dāng)?shù)組(Array)詳解”,方便廣大網(wǎng)友查閱!

ECMAScript的數(shù)組與其他語言中的數(shù)組有著相當(dāng)大的區(qū)別。雖然ECMAScript中的數(shù)組也是有序列表,但是它數(shù)組你的每一項(xiàng)可以保存任何類型的數(shù)據(jù)。ECMAScript數(shù)組的大小是可以動(dòng)態(tài)調(diào)整的。

創(chuàng)建數(shù)組的基本方式有兩種。第一種是使用Array構(gòu)造函數(shù),如下所示:

代碼如下:

var colors = new Array();

如果知道數(shù)組要保存的項(xiàng)目數(shù)量,也可以給構(gòu)造函數(shù)傳遞參數(shù),而該參數(shù)會(huì)自動(dòng)變成length屬性的值,如下:

代碼如下:

var colors = new Array(20);

也可以向Array構(gòu)造函數(shù)中傳遞數(shù)組中應(yīng)包含的項(xiàng),如下代碼所示:

代碼如下:

var colors = new Array("red","blue");

另外,使用Array構(gòu)造函數(shù)時(shí)也可以省略new操作符,如下所示:

代碼如下:

var colors = Array(20);

創(chuàng)建數(shù)組的第二種方式是使用數(shù)組字面量表示法。數(shù)組字面量由一對(duì)包含數(shù)組項(xiàng)的方括號(hào)表示,多個(gè)數(shù)組項(xiàng)之間用逗號(hào)隔開,如下所示:

代碼如下:

var color = ["red","blue"];

var names = [];

var values = [1,2,]//IE8及之前3項(xiàng),其他2項(xiàng),不建議使用

與對(duì)象一樣,在使用數(shù)字字面量表示法時(shí),也不會(huì)調(diào)用Array的構(gòu)造函數(shù)。

在讀取和設(shè)置數(shù)組的值時(shí),要使用方括號(hào)并提供相應(yīng)值的基于0的數(shù)字索引,如下所示:

代碼如下:

var colors = ["red","blue"]; //定義數(shù)組

alert(colors[0]); //red

colors[1] = "black" //修改第2項(xiàng)

colors[2] = "brown" //新增第3

數(shù)組的項(xiàng)數(shù)保存在其length屬性中,這個(gè)屬性始終會(huì)返回0或更大的數(shù)字,如下所示:

代碼如下:

var colors = ["red","blue"]; //定義數(shù)組

var names=[];

alert(colors.length); //3

alert(names.length) //0

值得注意的是,數(shù)組的length值不是只讀的。因此,通過設(shè)置此值,可以從數(shù)組的末尾移出項(xiàng)或向數(shù)組添加項(xiàng),如下:

代碼如下:

var colors = ["red","blue"];

colors.length = 1;

alert(colors[1]); //undefined

利用length屬性也可以方便的向數(shù)組末尾添加數(shù)據(jù):

代碼如下:

var colors = ["red","blue"];

colors[colors.length] = "black"; //在位置2新增

colors[colors.length] = "brown"; //在位置3新增

1、檢測(cè)數(shù)組

對(duì)于一個(gè)網(wǎng)頁或一個(gè)全局作用域而言,使用instanceof操作符可以做到:

代碼如下:

if(value instanceof Array){

// 執(zhí)行操作

}

instanceof操作符局限性在于全局作用域,如果網(wǎng)頁包含多個(gè)框架,就存在兩個(gè)以上的全局執(zhí)行環(huán)境。為了解決這個(gè)問題,ECMAScript5新增了Array.isArray()方法,使用如下:

代碼如下:

if(Array.isArray(value)){

// 執(zhí)行操作

}

2、轉(zhuǎn)化方法

調(diào)用數(shù)組的toString()方法會(huì)返回由數(shù)組中每個(gè)值的字符串形式拼接而成的一個(gè)以逗號(hào)分隔的字符串。而調(diào)用valueOf()返回還是數(shù)組。如下所示:

代碼如下:

var colors = ['red', 'blue', 'green'];

alert(colors.toString()); //red,blue,green

alert(colors.valueOf()); //red,blue,green

alert(colors) //red,blue,green

數(shù)組繼承的toLocalString()、tiString()和valueOf()方法,在默認(rèn)情況下都會(huì)以逗號(hào)分隔符的字符串形式返回?cái)?shù)組項(xiàng)。而如果使用join()方法,則可以使用不同的分隔符來構(gòu)建這個(gè)字符串。join()方法只接受一個(gè)參數(shù),即用作分隔符的字符串,如下所示:

代碼如下:

var colors = ['red', 'blue', 'green'];

alert(colors.join(',')); //red,blue,green

alert(colors.join('|')); //red|blue|green

如果數(shù)組中的某一項(xiàng)值為null或者undefied,那么該值在join()、toLocalString()、tiString()和valueOf()方法返回結(jié)果以空字符串表示。

3、棧方法

Javascript專門為數(shù)組提供了push()和pop()操作,以便實(shí)現(xiàn)類似棧的行為。

push()方法可以接收任意數(shù)量的參數(shù),把他們逐個(gè)添加到數(shù)組末尾,并返回修改后數(shù)組的長(zhǎng)度。pop()方法則從數(shù)組末尾溢出最后一項(xiàng),減少數(shù)組的length值,然后返回移出的項(xiàng)。

代碼如下:

var colors = new Array(); //定義數(shù)組

var count = colors.push("red", "blue"); //壓入兩項(xiàng)

alert(count); //2

count = colors.push("black"); //壓入另一項(xiàng)

alert(count); //3

var item = colors.pop(); //彈出最后一項(xiàng)

alert(item); //"black"

alert(colors.length); //2

4、隊(duì)列方法

棧數(shù)據(jù)結(jié)構(gòu)的訪問規(guī)則是LIFO(后進(jìn)先出),而隊(duì)列的訪問規(guī)則是FIFO(先進(jìn)先出)。隊(duì)列在列表末端添加項(xiàng),在前端移出項(xiàng)。

shift()方法能夠移除數(shù)組中的第一項(xiàng),并返回該項(xiàng),數(shù)組的length-1。結(jié)合push()和shift()方法,可以像使用隊(duì)列一樣使用數(shù)組,如下所示:

代碼如下:

var colors = new Array();

var count = colors.push("red", "blue");

count = colors.push("black");

alert(count);

var item = colors.shift(); //取得第一項(xiàng)

alert(item); //"red"

alert(color.length); //2

ECMAScript還為數(shù)組提供了unshift()方法。unshift()和shift()方法用途相反:它在數(shù)組前端添加任意個(gè)項(xiàng)并返回新數(shù)組的長(zhǎng)度。因此,同時(shí)使用unshift()和shift()方法,可以從相反方向來模擬隊(duì)列,即在數(shù)組前端添加新項(xiàng),從數(shù)組末端移出項(xiàng),如下所示:

代碼如下:

var colors = new Array();

var count = colors.push("red", "green");

alert(count); //2

count = colors.unshift("black"); //推入另一項(xiàng)

alert(count); //3

var item = colors.pop(); //取得最后一項(xiàng)

alert(item) //green

alert(colors.length) //2

5、重排序方法

數(shù)組中已經(jīng)存在兩個(gè)可以直接用來重排序的方法:reverse()和sort()。reverse()方法會(huì)按照反轉(zhuǎn)數(shù)組項(xiàng)的排序。

代碼如下:

var values = [2, 1, 3, 4, 5];

values.reverse();

alert(values); //5,4,3,2,1

默認(rèn)情況下,sort()方法按照升序排列數(shù)組項(xiàng),調(diào)用每一項(xiàng)的toString()方法,比較字符串,以確定如何排序。即使數(shù)組中的每一項(xiàng)都是數(shù)值,sort()方法比較的都是字符串。

代碼如下:

var values = [12, 11, 3, 4, 5];

values.sort();

alert(values); //12,11,3,4,5

我們可以通過一個(gè)比較函數(shù)當(dāng)作參數(shù)傳遞給sort()方法。如下:

代碼如下:

function compare(value1, value2) {

if (value1 < value2) {

return -1

} else if (value1 > value2) {

return 1

} else {

return 0

}

}

var values = [0, 1, 5, 10, 15];

values.sort(compare);

alert(values); //0,1,5,10,15

6、操作方法

ECMAScript為操作在數(shù)組中提供了很多方法。其中,concat()方法可以基于當(dāng)前數(shù)組中的所有項(xiàng)創(chuàng)建一個(gè)新數(shù)組。

代碼如下:

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()方法,它能夠基于當(dāng)前數(shù)組的一個(gè)項(xiàng)或多個(gè)項(xiàng)創(chuàng)建新數(shù)組,它可以接收一個(gè)或兩個(gè)參數(shù),即要返回項(xiàng)的起始和結(jié)束位置。一個(gè)參數(shù)時(shí),返回該參數(shù)指定位置開始到當(dāng)前數(shù)組末尾的所有項(xiàng)。兩個(gè)參數(shù)則返回起始到指定位置的所有項(xiàng)——不包括結(jié)束位置的項(xiàng)。注意,slipe()方法不影響原始數(shù)組。

代碼如下:

var colors=["red","green","blue","black","brown"];

var colors2=colors.slice(1);

var colors3=colors.slice(1,4);

alert(colors2); //green,blue,black,brown

alert(colors3); //green,blue,black

slice()方法刪除:可以刪除任意數(shù)量的項(xiàng),只需指定2個(gè)參數(shù):要?jiǎng)h除的第一項(xiàng)的位置和要?jiǎng)h除的項(xiàng)數(shù)。

slice()方法插入:可以向指定位置插入任意數(shù)量的項(xiàng),只需提供3個(gè)參數(shù):起始位置、0(要?jiǎng)h除的項(xiàng)數(shù))和要插入的項(xiàng)。

slipe()方法替換:可以項(xiàng)指定位置插入任意數(shù)量的項(xiàng),且同時(shí)刪除任意數(shù)量的項(xiàng),只需指定3個(gè)參數(shù):起始位置、要?jiǎng)h除的項(xiàng)數(shù)和要插入的任意數(shù)量的項(xiàng)。

代碼如下:

var colors = ["red", "green", "blue"];

//刪除

var removed = colors.slice(0, 1); //刪除第1項(xiàng)

var colors3 = colors.slice(1, 4);

alert(colors); //green,blue

alert(removed); //red

//插入

removed = colors.slice(1, 0,"yellow","orange"); //從位置1開始插入

alert(colors); //green,yellow,orange,blue

alert(removed); //空數(shù)組

//替換

removed = colors.slice(1, 1,"red","purple"); //從位置1開始插入

alert(colors); //green,"red","purple",orange,blue

alert(removed); //"yellow"

7、位置方法

ECMAScript5為數(shù)組提供了兩個(gè)位置方法:indexOf()和lastIndexOf()。這兩個(gè)方法都接收兩個(gè)參數(shù):要查找的項(xiàng)和表示查找起點(diǎn)位置的索引(可選)。其中indexOf()方法從數(shù)組的開頭開始先后查找,lastIndexOf()方法則從數(shù)組的末尾開始向前查找。

這兩個(gè)方法都返回要查找的項(xiàng)在數(shù)組中的位置,在沒有找到的情況下返回-1。

代碼如下:

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

8、迭代方法

ECMAScript5為數(shù)組定義了5個(gè)迭代方法。每個(gè)方法都接受兩個(gè)參數(shù),第一個(gè)是進(jìn)行迭代的函數(shù),第二個(gè)是該函數(shù)的作用域?qū)ο蟆究蛇x】。

進(jìn)行迭代的函數(shù)接受三個(gè)參數(shù),第一個(gè)是數(shù)組中要進(jìn)行迭代的元素的值,第二個(gè)是數(shù)組候總要進(jìn)行迭代的元素的位置,第三個(gè)是迭代數(shù)組本身。

1. every() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定的函數(shù),如果該函數(shù)對(duì)每一項(xiàng)都返回true,則返回true

2. filter() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定的函數(shù),返回該函數(shù)返回true的項(xiàng)組成的數(shù)組。

3. forEach() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定的函數(shù),這個(gè)方法沒有返回值 4. map() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定的函數(shù),返回每次函數(shù)調(diào)用的結(jié)果組成的數(shù)組

5. some() 對(duì)數(shù)組中的每一項(xiàng)運(yùn)行給定的函數(shù),如果該函數(shù)對(duì)任意一項(xiàng)返回true,則返回true

這些迭代方法支持的瀏覽器有,IE9+,F(xiàn)irefox2+,Safari3+,Opera 9.5+,chrome

在這些方法中,最相似的是every()和some(),它們都是用于查詢數(shù)組中的項(xiàng)是否滿足某個(gè)條件。對(duì)every()來說,傳入的函數(shù)必須對(duì)每一項(xiàng)都返回true,這個(gè)方法才返回true;否則,他就返回false。而some()方法則是只要傳入的函數(shù)對(duì)數(shù)組中某一項(xiàng)返回true,就返回true。

代碼如下:

var num = [1,2,3,4,5,6,7,8,9];

var everyResult = num.every(function(item, index, array) {

if(item > 2) {

return true;

}

});

alert(everyResult); //false

var someResult = num.some(function(item) {

if(item > 2) {

return true;

}

});

alert(someResult); //true

filter()是利用指定的函數(shù)確定是否在返回的數(shù)組中包含某一項(xiàng)。

代碼如下:

var num = [1,2,3,4,5,4,3,2,1];

var filterResult = num.filter(function(item) {

if(item > 2) {

return true;

}

});

alert(filterResult); //[3,4,5,4,3]

map()也返回一個(gè)數(shù)組,而這個(gè)數(shù)組的每一項(xiàng)都是在原始數(shù)組中的對(duì)應(yīng)項(xiàng)上運(yùn)行傳入函數(shù)的結(jié)果。

代碼如下:

var num = [1,2,3,4,5,4,3,2,1];

var mapResult = num.map(function(item) {

if(item > 2) {

return true;

}

}); //[2,3,6,8,10,8,6,4,2]

forEach()是對(duì)數(shù)組中的每一項(xiàng)運(yùn)行傳入的函數(shù)。這個(gè)方法沒有返回值,本質(zhì)上與使用for循環(huán)迭代數(shù)組一樣。

代碼如下:

var num = [1,2,3,4,5,4,3,2,1];

num.forEach(function(item) {

// 執(zhí)行操作

});

9、歸并方法

ECMAScript5中新增了兩個(gè)方法:reduceRight() 和 reduce()。這兩個(gè)方法都接受兩個(gè)參數(shù):第一個(gè)是用來迭代的數(shù)組的函數(shù),這個(gè)函數(shù)有四個(gè)參數(shù)分別是,前一個(gè)值,當(dāng)前值,項(xiàng)的索引,數(shù)組對(duì)象。然而這個(gè)函數(shù)的任何值都會(huì)作為第一個(gè)參數(shù)自動(dòng)傳給下一項(xiàng)。第二個(gè)是作為第一個(gè)函數(shù)中第一個(gè)參數(shù)的初始值 。

代碼如下:

var nums = [1,2,3,4,5];

var sum = nums.reduce(function(prev, cur, index, array) {

return prev + cur;

});

alert(sum);//15

更多信息請(qǐng)查看IT技術(shù)專欄

更多信息請(qǐng)查看腳本欄目
易賢網(wǎng)手機(jī)網(wǎng)站地址:JavaScript之?dāng)?shù)組(Array)詳解
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2025國考·省考課程試聽報(bào)名

  • 報(bào)班類型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 加入群交流 | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:526150442(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專用圖標(biāo)