JavaScript中的Array物件

瑾妹發表於2016-09-16

本文是我在CSDN中的第一篇部落格,主要是在學習過程中,很多知識容易忘記,希望能通過以寫部落格的方式幫助自己記憶,同時也希望能幫助到其他需要的人。本文是從JavaScript高階程式設計一書中整理而來。

1 建立Array物件

Array物件指的是陣列物件,建立Array的方式有很多種。如:

//建立一個空的陣列
var arr1=new Array();

//建立一個容量大小為10的陣列,即length屬性值為10
var arr2=new Array(10);

//建立一個陣列物件,裡面包含3個字串陣列
var arr3=new Array("red","green","blue");

可以看到,建立陣列物件時,可以指定初始容量,還可以指定初始元素內容。但是有一點需要注意:

當給Array傳遞一個引數時,如果是數值,則表示容量;其他則表示初始元素內容。

另外,值得注意的是:關鍵字new可以省略。

var colors=Array(3);//建立一個包含3項的陣列
var names=Array("Greg");//建立一個包含項,即“Greg”的陣列

除此之外,我們還可以通過中括號的方式建立陣列物件。

var colors=["red","green","blue"];//建立一個包含3個字串的陣列
var names=[];//建立一個空陣列

以中括號方式建立時,元素之間用逗號隔開,但是要注意:

不要在最後一個元素的後面多加一個逗號,這可能會帶來問題。

如:

var values=[1,2,];//這樣可能會建立一個包含2項或3項的陣列

2 陣列的訪問

2.1 索引訪問

陣列的訪問比較簡單,直接通過下標索引的方式即可訪問,如:arr[8]即為訪問陣列物件arr的下標為8的元素。

陣列物件有個常用的屬性:length。表示陣列包含的元素個數。

2.2 元素查詢

當要查詢某個元素在陣列中的位置時,可以通過indexOf()lastIndexOf()方法:

var numbers=[1,2,3,4,5,4,3,2,1];
alert(numbers.indexOf(4));//3
alert(numbers.lastIndexOf(4));//5

indexOf()即從頭向尾搜尋,lastIndexOf()從尾向頭搜尋。檔沒有找到指定的元素時,返回-1。也可以指定搜尋的起始位置,通過傳入2個引數:第一個參數列示要搜尋的元素,第二個參數列示搜尋的起始位置:

alert(numbers.indexOf(4,4));//5
alert(numbers.lastIndexOf(4,4));//3

2.3 迭代方法

迭代方法主要包含如下5個:

  1. every()
  2. filter()
  3. forEach()
  4. map()
  5. some()

他們的使用以及區別如下程式碼所示:

var numbers=[1,2,3,4,5,4,3,2,1];
/**
* 當所有的元素執行指定的函式的返回都為true時,every函式返回true
*/
var everyResult=numbers.every(function(item,index,array){
    return item>2;
});
alert(everyResult);//false

/**
* 只要有一個元素執行指定的函式的返回都為true時,some函式返回true
*/
var someResult=numbers.some(function(item,index,array){
    return item>2;
});
alert(someResult);//true

/**
* 返回子陣列,子陣列裡面的元素滿足指定函式的條件(即當執行該元素時,返回true)
*/
var filterResult=numbers.filter(function(item,index,array){
    return item>2;
});
alert(filterResult);//[3,4,5,4,3]

/**
* 返回一個陣列,該陣列的元素為對應原陣列的元素執行指定函式後的返回值
*/
var mapResult=numbers.map(function(item,index,array){
    return item*2;
});
alert(mapResult);//[2,4,6,8,10,8,6,4,2]

/**
* forEach相當於for(i=0;i<numbers.length;i++)
*/
numbers.forEach(function(item,index,array){
    //針對遍歷,執行指定操作
});

3 棧和佇列

JavaScript中,可以通過Array物件模擬棧和佇列操作。

3.1 棧

棧的操作無非就是壓棧和出棧,Array物件分別對應pop()push()兩個函式。

var colors=new Array();
//push函式可以連續壓多個元素,返回結果是當前棧的元素個數
var count=colors.push("red","green");
alert(count);//2

//pop彈出棧頂元素
var item=colors.pop();
alert(item);//green

從具體實現得角度來說,push函式對應於在陣列尾部新增元素,pop對應從陣列尾部刪除元素並把這個元素返回。

3.2 佇列

對於佇列,Array提供了一個函式shift(),主要作用為刪除陣列首部第一個元素並返回該元素。因此,我們可以通過shift()push()函式結合,模擬佇列的出隊和入隊過程。

另外,還有一個函式unshift()其作用與shift()恰好相反。用於在陣列的首部插入元素。因此,其實我們也可以通過組合pop()unshift()兩個函式模擬佇列的出隊和入隊的過程。

4 排序

Array物件有個sort()函式,用於實現陣列元素的排序。如:

var values=[0,1,5,10,15];
values.sort();
alert(values);//0,1,10,15,5

從註釋中可以看到,排序結果並沒有按照數字大小排序。其實,主要原因為:

預設情況下,sort()方法按升序排列元素,而Array允許裡面的元素不同,即允許裡面的元素中字串、數字、物件等同時存在,為了實現排序,sort()函式會呼叫每個陣列項的toString()方法,然後比較字串以確定如何排序。因此,即使裡面全是數值,最終還是會以字串的順序排序。

我們可以指定比較器,通過比較器來比較兩個元素哪個大哪個小!!!

function compare(value1,value2){
    return value1-value2;
}
var values=[0,1,5,10,15];
values.sort(compare);//指定比較器
alert(values);//0,1,5,10,15 

在比較器函式中,如果第一個引數比第二個函式小,返回負數,如果相等返回0,如果第二個數比第一個數小,返回正數。

Array物件中還有個reverse()函式,用於逆轉陣列,即1,2,3,4,5變成5,4,3,2,1

5 其他函式

5.1 判斷某個物件是否是Array物件

可以通過instanceof操作符

if(obj instanceof Array){
    //
}

也可以通過Array.isArray(obj)來判斷。

5.2 Array轉字串

簡單的轉換如下幾種方法:

var colors=["red","blue","green"];
alert(colors.toString());//red,blue,green
alert(colors.valueOf());//red,blue,green
alert(colors);//red,blue,green

如果希望在轉為字串時,指定連線符,則如下:

var colors=["red","blue","green"];
alert(colors.join(","));//red,blue,green
alert(colors.join("||"));//red||,blue||green

5.3 concat方法

concat方法為基於當前陣列中所有項建立一個新陣列。

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

alert(colors);//red,blue,green
alert(colors2);//red,blue,green,yello,black,brown

5.4 slice方法

slice方法是基於當前陣列中的一個或多個項建立一個新陣列。

var colors=["red","green","blue","yellow","purple"];
var colors2=colors.slice(1);
var colors3=colors.slice(1,4);


alert(colors2);//green,blue,yellow,purple
alert(colors3);//green,blue,yellow
alert(colors4);//
alert(colors5);//

slice函式還有其他功能,如:

//從位置2開始插入字串"red","green"
 colors.slice(2,0,"red","green");
//刪除當前位置2的項,然後再從位置2開始插入字串"red","green"
 colors.slice(2,1,"red","green");

相關文章