数组下标默认为大于或等于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来读取该元素值