JS对象和数组的理解

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表还是很实用的。

猜你喜欢

转载自blog.csdn.net/weixin_38189842/article/details/80241499