当前位置: 首页 > 科技观察

停止在JavaScript中使用对象作为哈希映射

时间:2023-03-15 19:02:41 科技观察

Map是日常编程中更常用的数据结构之一。它保留可以通过其键轻松访问的键值对。在Java中,很明显使用HashMap来达到这个目的。然而,在JavaScript中,使用普通对象来实现这一目标非常方便。constmap={};//插入键值对map['key1']='value1';map['key2']='value2';map['key3']='value3';//检查是什么mapcontainsKeyif(map.hasOwnProperty('key1')){console.log('Mapcontainskey1');}//通过特定key获取valueconsole.log(map['key1']);但是在JavaScript中有一个特殊的用途Built-indatastructure为此目的:Map。让我给你一些你更喜欢地图而不是普通对象的原因。1.更多键类型对象只能有符号或字符串。映射可以将任何类型的值作为键:对象、函数或基元。constmap=newMap();constmyFunction=()=>console.log('Iamausefulfunction.');constmyNumber=666;constmyObject={name:'plainObjectValue',otherKey:'otherValue'};map.set(myFunction,'functionasakey');map.set(myNumber,'numberasakey');map.set(myObject,'objectasakey');console.log(map.get(myFunction));//functionasakeyconsole.log(map.get(myNumber));//numberasakeyconsole.log(map.get(myObject));//objectasakey2.更好的大小确定Map提供了一个大小属性,但普通对象的大小必须以硬方式确定。确定Map的大小可以在O(1)时间内完成,而确定普通对象的大小则需要O(n)步。constmap=newMap();map.set('someKey1',1);map.set('someKey2',1);...map.set('someKey100',1);console.log(map.size)//100,运行时:O(1)constplainObjMap={};plainObjMap['someKey1']=1;plainObjMap['someKey2']=1;...plainObjMap['someKey100']=1;console.log(Object.keys(plainObjMap).length)//100,Runtime:O(n)3.更好的性能地图经过优化,可以频繁添加和删除条目。此外,可以在常数时间内检索Map的条目数,而必须计算普通对象的条目数,这需要O(n)时间。以我的MacbookPro为例,这是具有1000万个条目的Map的平均大小确定时间。PlainJSObjects:~1.6sMap:<1ms此外,它不需要将任何键转换为字符串,这节省了大量时间。4.对对象的直接迭代必须通过获取键并对其进行迭代来完成。另一方面,Map是可迭代的,这意味着它可以直接迭代。constmap=newMap();map.set('someKey1',1);map.set('someKey2',2);map.set('someKey3',3);for(let[key,value]ofmap){console.log(`${key}=${value}`);}//someKey1=1//someKey2=2//someKey3=3constplainObjMap={};plainObjMap['someKey1']=1;plainObjMap['someKey2']=2;plainObjMap['someKey3']=3;for(letkeyofObject.keys(plainObjMap)){constvalue=plainObjMap[key];console.log(`${key}=${value}`);}//someKey1=1//someKey2=2//someKey3=35。键顺序在ECMAScript2015之前,不保证对象的键以任何特定顺序出现。迭代Map保证键按插入顺序出现。6.覆盖没有键的普通对象因为它的原型已经包含了一些键,所以你的键和对象已经包含的键之间可能会发生冲突。地图是在没有任何键的情况下创建的。注意:从ECMAScript2015开始,您可以通过使用Object.create(null)创建普通对象图来避免意外的键覆盖。constmap=newMap();map.set('someKey1',1);map.set('someKey2',2);map.set('toString',3);//没有问题forMapconstplainObjMap=newMap();plainObjMap['someKey1']=1;plainObjMap['someKey2']=2;plainObjMap['toString']=3;//糟糕,nativeproperty