引用型別之Array(一)
Array型別
除了Object
之外,Array
型別在ECMAScript中也很常用。ECMAScript中的陣列與其他多數語言中的陣列有著相當大的區別。ECMAScript陣列的每一項可以儲存任何型別的資料。也就是說,可以用陣列第一個位置來儲存字串,用第二位置來儲存數值,用第三位置來儲存物件,以此類推。而且ECMAScript陣列的大小是可以動態調整的,即可以隨著資料新增自動增長以容納新增資料。
語法
建立陣列的基本方式有兩種。第一種是使用Array
建構函式,程式碼如下
var colors=new Array();
如果預先知道陣列要儲存的專案數量,也可以給建構函式傳遞該陣列,而且該數值會自動變成length
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
。