亚洲步兵一区二区三区-日韩精品伦理在线一区-亚洲色诱视频免费观看-久久人妻视频免费观看

廣州總部電話:020-85564311
廣州總部電話:020-85564311
20年
互聯網應用服務商
請輸入搜索關鍵詞
知識庫 知識庫

優網知識庫

探索行業前沿,共享知識寶庫

為什么 JavaScript 的 Map 比 Object 更好

發布日期:2025-08-20 18:29:17 瀏覽次數: 810 來源:前端崗
推薦語
JavaScript 的 Map 類型在鍵類型靈活性和內置方法上完勝 Object,是開發者的更優選擇。

核心內容:
1. Map 支持任意類型鍵,而 Object 僅限字符串或符號
2. Map 提供更直觀的內置方法,簡化鍵值對操作
3. 性能對比:Map 在頻繁增刪場景下表現更優
小優 網站建設顧問
專業來源于二十年的積累,用心讓我們做到更好!


点击蓝字,关注我 


原文: 《Why Is JavaScript’s Map Better Than Object?》[1]

作者:Hui[2]


JavaScript 提供了 Map 和 Object 来存储键值对,但是 Map 在许多场景下具有显著的优势。

1. Key 类型的灵活性

1.1 键的范围

Object:

对象键 只能是字符串或符号。其他类型(例如对象、函数和数字)会 自动转换为字符串:

const obj = {};
const key = { id1 };
obj[key] = 'value'// Key is converted to "[object Object]"
console.log(obj);    // { "[object Object]": "value" }
Map:

Map 的键可以是 任何类型,包括对象、函数和 NaN:

Copyconst map = new Map();
const key = { id1 };
map.set(key, 'value');  // Key retains its original type
console.log(map.get(key)); // "value"

1.2 处理特殊键

使用 NaN 作为键:

Copyconst map = new Map();
map.set(NaN'Not a Number');
console.log(map.get(NaN)); // "Not a Number"
const obj = {};
obj[NaN] = 'Not a Number';
console.log(obj[NaN]); // "Not a Number", but internally converted to the string "NaN"

Map 可以正确识别 NaN 作为唯一键,而 Object 会将其转换为字符串。

2. 内置方法和性能

2.1 内置方法

Map 提供了更直观的 API:

Copymap.set(key, value);  // Add a key-value pair
map.get(key);         // Retrieve a value
map.has(key);         // Check if a key exists
map.delete(key);      // Remove a key-value pair
map.clear();          // Remove all entries
map.size;             // Get the number of entries (no need for Object.keys(obj).length)

相比之下,Object 需要手动处理:

Copyobj[key] = value;      // Add a property
obj[key];              // Retrieve a value
delete obj[key];       // Remove a property
Object.keys(obj).length; // Get the number of properties

2.2 迭代效率

Map 支持直接迭代:

Copymap.forEach((value, key) => { /* ... */ });
for (const [key, value] of map) { /* ... */ }

相反,Object 在迭代之前需要进行转换:

CopyObject.keys(obj).forEach(key => { /* ... */ });
Object.values(obj).forEach(value => { /* ... */ });
Object.entries(obj).forEach(([key, value]) => { /* ... */ });

2.3 性能比较

  • 频繁的增删改查操作:Map 针对频繁的键值插入和删除操作做了优化。
  • 处理大型数据集:Map 通常在内存使用和访问速度方面表现更好,尤其是动态生成的键。

3. 保留插入顺序

Map 严格维护键值对的插入顺序,非常适合顺序很重要的场景:

Copyconst map = new Map();
map.set('a'1);
map.set('b'2);
console.log([...map]); // [['a', 1], ['b', 2]]

对于对象,ES6+ 保证以下顺序:

  • 数字键按升序排序。
  • 字符串键维持插入顺序。
  • 符号键保持插入顺序。 但是,依赖对象键顺序可能会导致兼容性问题,尤其是在较旧的 JavaScript 引擎中。

4. 避免原型污染

对象容易受到原型链污染:

Copyconst obj = {};
console.log(obj.constructor); // Outputs Object constructor
obj.hasOwnProperty('key');    // Can be overridden

Map 独立于原型链:

Copyconst map = new Map();
console.log(map.constructor); // Outputs Map constructor
map.set('hasOwnProperty''safe'); // Safe to use

5. 推荐使用场景

场景
推荐的数据结构
原因
复杂键类型(对象、函数)
Map
支持任何键类型
频繁的键值插入和删除
Map
Map 性能更强
保持插入顺序
Map
保证插入顺序
快速键值计数和检索
Map
插入键值对数量和大小计算更快
避免原型污染
Map
不受原型链的干扰
只需要基础字符串键名的简单静态数据
Object
语法简洁
对象需要 JSON 序列化
Object
Map 不能直接序列化

6. 代码示例

6.1 词频统计

使用Map:

Copyconst text = "apple banana apple orange";
const wordCount = new Map();
text.split(' ').forEach(word => {
  wordCount.set(word, (wordCount.get(word) || 0) + 1);
});
console.log(wordCount.get('apple')); // 2

使用 Object:

Copyconst text = "apple banana apple orange";
const wordCount = {};
text.split(' ').forEach(word => {
  wordCount[word] = (wordCount[word] || 0) + 1;
});
console.log(wordCount.apple); // 2

6.2 使用对象作为键

使用 Map 的正确实现:

Copyconst user1 = { id1 };
const user2 = { id2 };
const permissions = new Map();
permissions.set(user1, ['read']);
permissions.set(user2, ['write']);
console.log(permissions.get(user1)); // ['read']

使用 Object 会失败:

Copyconst user1 = { id1 };
const user2 = { id2 };
const permissions = {};
permissions[user1] = ['read'];  // Key converted to "[object Object]"
permissions[user2] = ['write']; // Overwrites previous key
console.log(permissions[user1]); // ['write']

7. 结论

在以下情况下使用 Map:

  • 使用动态或复杂的键类型
  • 执行频繁插入或删除
  • 保留插入顺序
  • 快速检索已插入条目数量
  • 避免原型链干扰

在以下情况下使用对象:

  • 存储简单、静态的数据
  • 需要 JSON 序列化
  • 更喜欢使用更简洁的语法来定义键值对

在现代 JavaScript 开发中选择正确的数据结构可以显著提高代码的可维护性和性能。

引用链接
[1] 《Why Is JavaScript’s Map Better Than Object?》: https://medium.com/@hxu0407/why-is-javascripts-map-better-than-object-4a7fc25a25ea
[2] Hui: https://medium.com/@hxu0407

点击关注 “前端岗” ,一个聚焦前端岗位的技术号!




谢谢支持 

優網科技,優秀企業首選的互聯網供應服務商

優網科技秉承"專業團隊、品質服務" 的經營理念,誠信務實的服務了近萬家客戶,成為眾多世界500強、集團和上市公司的長期合作伙伴!

優網科技成立于2001年,擅長網站建設、網站與各類業務系統深度整合,致力于提供完善的企業互聯網解決方案。優網科技提供PC端網站建設(品牌展示型、官方門戶型、營銷商務型、電子商務型、信息門戶型、微信小程序定制開發、移動端應用(手機站APP開發)、微信定制開發(微信官網、微信商城、企業微信)等一系列互聯網應用服務。


我要投稿

姓名

文章鏈接

提交即表示你已閱讀并同意《個人信息保護聲明》

專屬顧問 專屬顧問
掃碼咨詢您的優網專屬顧問!
專屬顧問
馬上咨詢
聯系專屬顧問
聯系專屬顧問
聯系專屬顧問
掃一掃馬上咨詢
掃一掃馬上咨詢

掃一掃馬上咨詢

和我們在線交談!
主站蜘蛛池模板: 欧美日韩在线国产一区| 夜夜女人国产香蕉久久精品| 国产厕所偷拍高清在线一区二区三区| 亚洲一区在线观看不卡| 国产麻豆一区精品视频| 一区二区三区四区高清国产| 国产精品性视频一区二区| 欧美日韩另类在线播放| 中文人妻在线免费视频| 91精品成人免费国产| 久久99精品久久久久久清纯| 亚洲一区综合在线观看| 亚洲熟女一二三区综合在线| 亚洲欧美激情另类在线| 久久久久国产精品国产精品| 中文字幕人妻免费视频| 国产免费69丝袜在线播放| 欧美成人精品一区二区免| 亚洲国产高清国产精品| 欧美三级中文字幕久久精品| 在线一区二区三区中文| 中文字幕熟妇久久久人妻麻豆| 国产aaa精品久久久婷婷| 五月天网站一区二区三区| 蜜臀av国产一区二区| 中文字幕人妻免费视频| 亚洲成a在线在线播放| 男女裸体做爰视频免费网站| 亚洲一区二区三区中出| 精品国产中文字幕懂色| 韩国一区二区三区视频在线播放| 日本护士色系亚洲精品国产精品| 国产亚洲一区二区三区欧美| 欧美日韩综合一区在线| 欧美激情一区二区三区在线| 亚洲一区二区三区网站| 欧美久久久久一区二区三区18禁| 91一区二区三区免费看| 亚洲一区二区福利深夜欧美| 欧美亚洲精品免费二区| 一区二区三区女人毛片|