數組下標默認為大於或等於0的整數,不過JavaScript允許數組下標可以為任意表達式,甚至為任意類型數據。
(1)文本下標
為數組下標指定負值:
var a=;//定義空數組直接量
a[-1]=1;//為下標為-1的元素賦值
很顯然,上面的用法是非法的,因為這不符合語法規範。使用length屬性檢測,返回值為0,說明數組並沒有增加長度,這是正確的,也很正常。但是,使用下面的方法可以讀取該元素的值:
alert(a.length);//0,說明數組長度沒有增加
alert(a[-1]);//1
alert(a["-1"]);//1,說明這個值以對像屬性的形式被存儲
不僅如此,還可以為數組指定字符串下標,或者布爾值下標,例如:
var a=;
a[true]=1;
a[false]=0;
alert(a.length);//0,說明數組長度沒有增加
alert(a[true]);//1
alert(a[false]);//0
alert(a[0]);//undefined
alert(a[1]);//undefined
雖然true和false可以被轉換為1和0,但是JavaScript並沒有執行轉換,而是把它們視為對像屬性來看待。如果文本是數字,可以直接使用數字下標來訪問,這時JavaScript又能夠自動轉換它們的類型。例如:
a["1"]=1;
alert(a[1]);//1
這種數據存儲格式稱為哈希表。哈希表的數據檢索速度要快於數組迭代檢索,因此,對於下面的操作:
var a=[["張三",1],["李四",2],["王五",3]];//二維數組
for(var i in a){//遍歷二維數組
if(a[i][0]=="李四")alert(a[i][1]);//檢索指定元素
}
將數組下標改為文本下標會更為高效。
var a=;//定義空數組
a["張三"]=1;//以文本下標來存儲元素的值
a["李四"]=2;
a["王五"]=3;
alert(a["李四"]);//快速定位檢索
(2)二維數組下標
JavaScript不支持定義二維數組的語法,但我們可以模仿其他語言中二維數組的形式來定義數組。例如,下面的寫法雖然不符合語法上的規定,但是JavaScript不會提示編譯錯誤:
var a=;
a[0,0]=1;
a[0,1]=2;
a[1,0]=3;
a[1,1]=4;
如果調用length屬性,返回值為2,則說明僅有兩個元素,分別讀取元素的值,代碼如下:
alert(a.length);//2,說明僅有兩個元素有效
alert(a[0]);//3
alert(a[1]);//3
JavaScript把二維數組下標視為一個逗號表達式,其運算的返回值是最後一個值。前面兩行代碼賦值就被後面兩行代碼賦值覆蓋了。因此,如果經過計算之後才確定下標值,之後再進行存取操作,則可以按如下方式進行設計:
var a=,i=1;//初始化變量
while(i<10){//指定循環次數
a[i*=2,i]=i;//指定下標為2的指數時才進行賦值
}
alert(a.length);//17
alert(a);//[,,2,,4,,,,8,,,,,,,,16]
(3)對像下標
對象也可以作為數組下標。JavaScript會試圖把對像轉換為數值,如果不行,則把它轉換為字符串,然後以文本下標的形式進行操作。例如:
var a=;//數組直接量
var b=function{//函數直接量
return 2;
}
a[b]=1;//把對像作為數組下標
alert(a.length);//長度為0
alert(a[b]);//1
可以這樣讀取元素值:
var s=b.toString;//獲取對象的字符串
alert(a[s]);//利用文本下標讀取元素的值
還可以這樣設計下標:
a[b]=1;//在下標處調用函數,則返回值為2
alert(a[2]);//因此可以使用2來讀取該元素值