如果数组的下标值超出范围,如负数、浮点数、布尔值、对象或其他值,JavaScript会自动把它转换为一个字符串,并定义为关联数组。
关联数组就是与数组关联的对象,简单说就是数组对象,字符串下标就是数组对象的属性。
【示例1】在下面示例中,数组下标false、true将不会被强制转换为数值0、1,JavaScript会把变量a视为对象,false和true转换为字符串被视为对象的属性名。
var a = []; //声明数组 a[false] = false; a[true] = true; console.log( a[0] ); //返回 undefined console.log( a[1] ); //返回 undefined console.log( a[false] ); //返回 false, console.log( a[true] ); //返回 true console.log( a["false"] ); //返回 false, console.log( a["true"] ); //返回 true
【示例2】关联数组是一种数据格式,被称为哈希表。哈希表的数据检索速度要优于数组。
var a = [["张三",1],["李四",2],["王五",3]]; //二维数组 for(var i in a){ //遍历二维数组 if(a[i][0] == "李四") console.log(a[i][1]) ; //检索指定元素 }
如果使用文本下标会更为高效:
var a = []; //定义空数组 a["张三"] = 1; //以文本下标来存储元素的值 a["李四"] = 2; a["王五"] = 3; console.log(a["李四"] ); //快速定位检索
【示例3】对象也可以作为数组下标,JavaScript会试图把对象转换为数值,如果不行,则把它转换为字符串,然后以文本下标的形式进行操作。
var a = []; //数组直接量 var b = function(){ //函数直接量 return 2; } a[b] = 1; //把对象作为数组下标 console.log( a.length ); //返回长度为0 console.log( a[b] ); //返回1
可以这样读取元素值:
var s =b.toString(); //获取对象的字符串 console.log( a[s] ); //利用文本下标读取元素的值
还可以这样设计下标,此时为数组的元素,而不是关联属性了。
a[b()] = 1; //在下标处调用函数,则返回值为2 console.log( a[2] ); //所以可以使用2来读取该元素值 console.log( a.length ); //返回数组长度为3