首页 » 编写高质量代码:改善JavaScript程序的188个建议 » 编写高质量代码:改善JavaScript程序的188个建议全文在线阅读

《编写高质量代码:改善JavaScript程序的188个建议》建议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来读取该元素值