文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2024-12-11 20:03

关注

[[332917]]

 

  1. const map = {}; 
  2.  
  3. // 插入键值对 
  4. map['key1'] = 'value1'
  5. map['key2'] = 'value2'
  6. map['key3'] = 'value3'
  7.  
  8. // 检查map包含的键 
  9. if (map.hasOwnProperty('key1')) { 
  10.   console.log('Map contains key1'); 
  11.  
  12. // 通过特定的键获得值 
  13. console.log(map['key1']); 

但是JavaScript中有一个专门用于此目的的内置数据结构:Map。让我给你一些理由,让你喜欢Map而不是普通的对象。

1.更多键类型

对象只能有符号(symbols)或字符串。Map可以将任何类型的值作为键:对象,函数或基元(primitives)。

 

  1. const map = new Map(); 
  2. const myFunction = () => console.log('I am a useful function.'); 
  3. const myNumber = 666; 
  4. const myObject = { 
  5.   name'plainObjectValue'
  6.   otherKey: 'otherValue' 
  7. }; 
  8. map.set(myFunction, 'function as a key'); 
  9. map.set(myNumber, 'number as a key'); 
  10. map.set(myObject, 'object as a key'); 
  11.  
  12. console.log(map.get(myFunction)); // function as a key 
  13. console.log(map.get(myNumber)); // number as a key 
  14. console.log(map.get(myObject)); // object as a key 

2.更好地确定大小

Map提供了一个size属性,但一个普通对象的大小却必须通过艰难的方式来确定。确定Map的大小可以在O(1)时间内完成,而确定一个普通对象的大小则需要O(n)步。

 

  1. const map = new Map(); 
  2. map.set('someKey1', 1); 
  3. map.set('someKey2', 1); 
  4. ... 
  5. map.set('someKey100', 1); 
  6.  
  7. console.log(map.size) // 100, Runtime: O(1) 
  8.  
  9. const plainObjMap = {}; 
  10. plainObjMap['someKey1'] = 1; 
  11. plainObjMap['someKey2'] = 1; 
  12. ... 
  13. plainObjMap['someKey100'] = 1; 
  14.  
  15. console.log(Object.keys(plainObjMap).length) // 100, Runtime: O(n) 

3.更好的性能

对Map进行了优化,以便频繁地添加和删除条目。

此外,Map的条目数可以在恒定的时间内被检索,而一个普通对象的条目数必须被计算,这需要O(n)时间。

以我的Macbook Pro为例,这是一张有1000万个条目的Map的平均大小确定时间。

此外,它不需要将任何键转换为字符串,这可以节省很多时间。

 

4.直接迭代

对象必须通过获取键并对其进行迭代。另一方面,Map是可迭代的,这意味着它可以直接迭代。

 

  1. const map = new Map(); 
  2. map.set('someKey1', 1); 
  3. map.set('someKey2', 2); 
  4. map.set('someKey3', 3); 
  5.  
  6. for (let [key, value] of map) { 
  7.   console.log(`${key} = ${value}`); 
  8. // someKey1 = 1 
  9. // someKey2 = 2 
  10. // someKey3 = 3 
  11.  
  12. const plainObjMap = {}; 
  13. plainObjMap['someKey1'] = 1; 
  14. plainObjMap['someKey2'] = 2; 
  15. plainObjMap['someKey3'] = 3; 
  16.  
  17. for (let key of Object.keys(plainObjMap)) { 
  18.   const value = plainObjMap[key]; 
  19.   console.log(`${key} = ${value}`); 
  20. // someKey1 = 1 
  21. // someKey2 = 2 
  22. // someKey3 = 3 

5.key顺序

在ECMAScript 2015之前,一个对象的键不保证以任何特定的顺序出现。在Map上迭代保证键按插入顺序出现。

6.无键覆盖

一个普通对象由于其原型已经包含了一些键,你的键和对象已经包含的键之间可能会有冲突。Map在创建时不包含任何键。

注意:自ECMAScript 2015年起,你可以通过使用 Object.create(null) 来创建你的普通对象图来避免意外的键覆盖。

 

  1. const map = new Map(); 
  2. map.set('someKey1', 1); 
  3. map.set('someKey2', 2); 
  4. map.set('toString', 3); // No problem for Map 
  5.  
  6. const plainObjMap = new Map(); 
  7. plainObjMap['someKey1'] = 1; 
  8. plainObjMap['someKey2'] = 2; 
  9. plainObjMap['toString'] = 3; // Oops, native property 

 

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯