1. 程式人生 > 實用技巧 >引用型別之Array(一)

引用型別之Array(一)

Array型別

除了Object之外,Array型別在ECMAScript中也很常用。ECMAScript中的陣列與其他多數語言中的陣列有著相當大的區別。ECMAScript陣列的每一項可以儲存任何型別的資料。也就是說,可以用陣列第一個位置來儲存字串,用第二位置來儲存數值,用第三位置來儲存物件,以此類推。而且ECMAScript陣列的大小是可以動態調整的,即可以隨著資料新增自動增長以容納新增資料。

語法

建立陣列的基本方式有兩種。第一種是使用Array建構函式,程式碼如下

var colors=new Array();

如果預先知道陣列要儲存的專案數量,也可以給建構函式傳遞該陣列,而且該數值會自動變成length

屬性的值。例如,下面的程式碼將建立length值為20的陣列

var colors=new Array(20);

也可以向Array建構函式傳遞陣列中應該包括的項。

//以下程式碼建立了一個包括三個字串值得陣列
var colors=new Array("red","blue","pink")

給建構函式傳遞一個值也可以建立陣列,如果傳遞的是數值,那麼就會建立length為這個數值的陣列,如果傳遞的是其他型別的引數,則會建立包含那個值的只有一項的陣列。例子如下

var colors=new Array(3);        //建立一個包含3項的陣列
var names=new Array("breeze");	//建立一個包含1項,即字串"breeze"的陣列

另外,在使用Array建構函式時也可以省略new操作符,如下

var colors=Array(3);
var names=Array("breeze");

建立陣列的第二種基本方法是使用陣列字面量表司法。陣列字面量由一對包括陣列項的方括號表示,多個數組項之間以逗號隔開,如下所示

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

讀取和修改

使用方括號並提供響應值的基於0的數字索引,如下所示:

var colors=["red","blue","green"];
alert(colors[0]);   //"red"
colors[2]="black";  //修改第三項
colors[3]="white";  //增加第四項

方括號中的索引表示要訪問的值。如果索引小於陣列中的項數,則返回對應項的值,所以colors[0]會返回"red"。設定陣列的值也使用同樣的語法,但會替換原來的值。如果索引數超過陣列長度,則是新增。

陣列的length屬性

陣列的項數儲存在length屬性中,這個屬性始終會返回0或更大的值,如下面這個例子所示:

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

alert(colors.length);     //3
alert(names.length);      //0

陣列的length屬性很有特點—— 它不是隻讀的。因此,通過設定這個屬性,我們可以從陣列的末尾移除或向陣列中新增新項。請看下例

var colors=["red","blue","pink"];      //建立一個包括3個字串的陣列
colors.length=2;
alert(colors[2]);              //undefined

這個例子中的陣列colors一開始有三個值。將其length屬性設定為2會移除最後一項,結果再訪問colors[2]就會顯示undefined了。如果將length屬性設定為大於陣列項數的值,則新增的每一項都會取得undefined,如下

var colors=["red","blue","pink"];      //建立一個包括3個字串的陣列
colors.length=4;
alert(colors[3]);         //undefined 

雖然colors陣列包括3個項,但把它的length屬性設定成了4。這陣列不存在位置3,所以訪問這個位置的值就得到了特殊值undefined。

利用length屬性也可以在陣列末尾新增新項,如下

var colors=["red","blue","pink"];
colors[colors.length]="black";   //在位置3新增新項
colors[colors.length]="white";   //在位置4新增新項

原理:由於陣列的最後一項的索引都是length-1,因此新項的下一個位置都是length這個值。

當把一個值放在超出當前陣列大小的位置上時,陣列就會重新計算長度,即長度值等於最後一項的索引加1,如下

var colors=["red","blue","pink"];
colors[99]="black";
alert(colors.length);  //100

在這個例子中,我們向colors陣列的位置99插入了一個值,結果陣列新長度length就是100(99+1)。而位置3到位置98實際上都是不存在的所以我們訪問它們都將返回undefined