let a={};
a[0]="吃饭";
a[{x:2}]="跑步";
for(let i in a){
console.log(`type:${typeof i},${i}:${a[i]}`)
}
//type:string,0:吃饭 type:string,[object Object]:跑步
let b=[];
b[0]="吃饭";
b["1"]="喝茶"
for(let i in b){
console.log(`type:${typeof i},${i}:${b[i]}`)
}
//type:string,0:吃饭 type:string,1:喝茶
可以看出不管对象还是数组,JS引擎会把[]里的内容转为字符串,可以再做一个验证
const a={};
const b=Object.setPrototypeOf({},{toString(){
return "type"
}});
a[b]="吃饭";
for(let i in a){
console.log(`type:${typeof i},${i}:${a[i]}`)
}
//type:string,type:吃饭
JS的对象其实是一个hash表,数组其实也是一个hash表,并不是传统的数组结构通过索引下标定位,因为JS数组可以通过key来定位集合中的对象,可以做个验证
const a=[];
a.b="吃饭";
a[0]="睡觉";
for(let i in a){
console.log(`type:${typeof i},${i}:${a[i]}`)
}
//type:string,0:睡觉 type:string,b:吃饭
hash表其实是一个数组,key通过码表转换相对应的映射,然后通过哈希算法获取对应的数组下标,通过数组下标定位可以得到一个链表(避免冲突的一个方法,因为不同的key可能获得相同的下标,这个也要看对应的哈希算法了,算法好时间复杂度为O(1)),通过链表中每个元素的key来获取对应的value。当然hash表也有一些缺点,由于它是基于数组的,数组创建后难于扩展(比如拷贝hash表到一个更大的数组中),某些哈希表被基本填满时,性能下降得非常严重。但是如果能确定数据大小,hash表还是很实用的。