当前位置: 首页 > news >正文

javascript Map是什么_与对象有什么区别【教程】

Map 是 JavaScript 中的键值对集合,它和普通对象(Object)都能存键值,但底层机制、行为规则和适用场景完全不同——别用 Object 当 Map 用,尤其当键可能是对象、数字或需要精确顺序时。

Map 的键可以是任意类型,Object 的键只能是字符串或 Symbol

这是最根本的区别。Object 会把非字符串/Symbol 键隐式转成字符串,导致意外覆盖:

const obj = {};
obj[{}] = 'a';
obj[{}] = 'b';
console.log(obj); // { '[object Object]': 'b' } —— 两个空对象被当成同一个键

Map 严格按引用或值比较:

  • Mapnew Map().set({}, 'a').set({}, 'b') 确实存了两个不同键
  • 数字 1 和字符串 '1'Map 中是不同键;在 Object 中,obj[1]obj['1'] 访问的是同一个属性
  • undefinednullNaN 都可作为 Map 的合法键;Object 中 obj[undefined] 实际访问的是 obj['undefined']
Map 保持插入顺序,Object 的属性顺序不总可靠

ES2015+ 规范规定 Map 的遍历顺序严格等于插入顺序,且 keys()values()entries() 全部遵循这一点。

Object 的属性顺序虽然现在多数引擎对字符串键也按插入顺序返回,但存在例外:

  • 数值型字符串键(如 '10''2')会被排序在前,破坏插入顺序
  • 早期代码或某些 polyfill 下行为可能不一致
  • 不能依赖 Object.keys()for...in 的顺序做逻辑判断

如果你需要“先加的先遍历”,用 Map 更稳妥。

Map 的大小和遍历更直接,Object 需要额外处理

Map 提供原生 size 属性和迭代器接口:

const m = new Map();
m.set('a', 1).set('b', 2);
console.log(m.size); // 2
for (const [k, v] of m) console.log(k, v); // 按插入顺序输出

而 Object 要获取键值对数量,得写 Object.keys(obj).length;遍历时要么用 for...in(还要防原型链),要么转成数组再操作,多一层转换开销。

另外:Mapset()get()has()delete() 时间复杂度都是平均 O(1),而 Object 的属性访问虽快,但涉及动态原型链查找或隐藏类变更时,性能边界不如 Map 可控。

什么时候该用 Map,而不是 Object?

不是“哪个更好”,而是“哪个更合适”。以下情况优先选 Map

  • 键不确定类型,比如来自用户输入、DOM 元素、函数、其他对象
  • 需要频繁增删键值对,且关心操作顺序或迭代一致性
  • NaN0 做键(Objectobj[NaN] 等价于 obj['NaN']
  • 构建缓存、映射表、计数器等工具逻辑,尤其是配合 WeakMap 做弱引用时

如果只是静态配置、简单字面量结构、或与 JSON/后端字段强对应(比如 { id: 1, name: 'foo' }),Object 依然更自然、更轻量。

真正容易被忽略的是:Map 不会把键自动转成字符串,也不参与原型链——这意味着你不能用点语法访问,也不能意外继承 toString 等方法。这种“不灵活”,恰恰是它可靠的原因。

http://www.jsqmd.com/news/284853/

相关文章:

  • 哲讯科技:以半导体SAP之道,铸就中国“芯”时代的智能基石
  • 哲讯科技:以半导体SAP之道,铸就中国“芯”时代的智能基石
  • RAG 为什么总是“看起来能用,实际不好用”?
  • 小型精密CNC车床/数控车床哪家好?2026年优质代理商深度评测
  • 2026年冠金石生产厂家TOP5权威推荐:上海岩首领航高端仿石漆新纪元
  • 【2026最新】SQL 三种注入方式详解,零基础入门到精通,收藏这一篇就够了_sql注入
  • 2026年冠金石生产厂家TOP5权威推荐:上海岩首领航高端仿石漆新纪元
  • 塔城塔城乌苏额敏沙湾托里英语雅思辅导机构推荐,2026权威出国雅思课程口碑排行榜
  • C++虚函数实现原理深度解析:从多态到底层机制
  • 2026年轴流风机厂家最新推荐:防爆轴流风机/防腐轴流风机/高压轴流风机/sfb轴流风机/sf轴流风机/wf屋顶轴流风机/选择指南
  • 2026 英语雅思网课一对一辅导平台排行榜:高性价比提分机构权威推荐​
  • 网络安全入门:什么是网络安全?为何它关乎每个人的数字生活?
  • YOLOv8-Pose 姿态识别 RK3588 实战:从模型训练到 RKNN 部署,精度与推理速度双提升
  • 2026年屋顶、隧道、边墙、混流、排烟风机十大品牌推荐:多区域实力企业务实之选
  • YOLOv13 全面教程:MogaBlock 模块原理深度解析与实战修改(手把手教学)
  • 全域网络安全防御 健全网络安全防护体系
  • 导师严选2026 AI论文平台TOP9:继续教育写作全攻略
  • 高压漏电起痕试验仪
  • 使用onlyoffice预览word、excel、ppt、pdf等,可以双击index.html看效果的demo示例
  • 【网络安全】你必须知道的几个网络安全概念
  • YOLOv13 RAB(Residual Attention Block)原理深度解析:多级残差 + 空间注意力的创新设计与应用
  • 绝缘材料高压漏电起痕试验仪BLD-6000V
  • 2026年高速印刷机加工厂选择:这些技巧助你避坑,市面上高速印刷机排名聚焦优质品牌综合实力排行
  • 毕设数据不够?YOLO自动数据增强实战:一键生成图片+XML,小样本也能训模型
  • 【全网最全】sql注入详解
  • 基于Java的山区防洪治理智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • YOLOv8 + RepVGG + QueryDet 小目标检测实战指南:遥感图像检测从原理到落地
  • Redis 淘汰策略切换会对现有数据有何影响?深度解析 + Spring Boot 实战避坑指南
  • 科研论文写作助手:8款智能翻译与文本改进工具排行
  • 模块化多电平变换器MMC两种调制策略实现仿真分享