关联数组

课后整理 2020-12-10

如果数组的下标值超出范围,如负数、浮点数、布尔值、对象或其他值,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