本文共 1828 字,大约阅读时间需要 6 分钟。
建议55:不要拘泥于数字下标
数组下标默认为大于或等于0的整数,不过JavaScript允许数组下标可以为任意表达式,甚至为任意类型数据。(1)文本下标为数组下标指定负值:var a = []; // 定义空数组直接量a[-1] = 1; // 为下标为-1的元素赋值很显然,上面的用法是非法的,因为这不符合语法规范。使用length属性检测,返回值为0,说明数组并没有增加长度,这是正确的,也很正常。但是,使用下面的方法可以读取该元素的值:alert(a.length); // 0,说明数组长度没有增加alert(a[-1]); // 1alert(a["-1"]); // 1,说明这个值以对象属性的形式被存储不仅如此,还可以为数组指定字符串下标,或者布尔值下标,例如:var a = [];a[true] = 1;a[false] = 0;alert(a.length); //0,说明数组长度没有增加alert(a[true]); //1alert(a[false]); //0alert(a[0]); //undefinedalert(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]); //3alert(a[1]); //3JavaScript把二维数组下标视为一个逗号表达式,其运算的返回值是最后一个值。前面两行代码赋值就被后面两行代码赋值覆盖了。因此,如果经过计算之后才确定下标值,之后再进行存取操作,则可以按如下方式进行设计:var a = [], i = 1; // 初始化变量while( i < 10 ){ // 指定循环次数a[i *= 2 , i] = i; // 指定下标为2的指数时才进行赋值
}
alert( a.length ); //17alert( a ); //[,,2,, 4,,,, 8,,,,,,,, 16](3)对象下标对象也可以作为数组下标。JavaScript会试图把对象转换为数值,如果不行,则把它转换为字符串,然后以文本下标的形式进行操作。例如:var a = []; // 数组直接量var b = function(){ // 函数直接量return 2;
}
a[b] = 1; // 把对象作为数组下标alert( a.length ); //长度为0alert( a[b] ); //1可以这样读取元素值:var s =b.toString(); // 获取对象的字符串alert( a[s] ); // 利用文本下标读取元素的值还可以这样设计下标:a[b()] = 1; // 在下标处调用函数,则返回值为2alert( a[2] ); // 因此可以使用2来读取该元素值转载地址:http://gmukx.baihongyu.com/