讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議55:不要拘泥於數字下標 >

建議55:不要拘泥於數字下標

數組下標默認為大於或等於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來讀取該元素值