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

发布时间 - 2026-01-22 00:00:00    点击率:
Map 的键可为任意类型且严格按引用或值比较,Object 键仅限字符串/Symbol并会隐式转换;Map 保持插入顺序、提供 size 属性和高效 O(1) 操作,适用动态键、频繁增删及需顺序遍历场景。

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 等方法。这种“不灵活”,恰恰是它可靠的原因。


# javascript  # java  # js  # json  # 工具  # 后端  # 区别  # 键值对  # 隐式转换 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  LinuxShell函数封装方法_脚本复用设计思路【教程】  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  高防服务器如何保障网站安全无虞?  高防服务器:AI智能防御DDoS攻击与数据安全保障  Android okhttputils现在进度显示实例代码  如何快速搭建高效WAP手机网站吸引移动用户?  如何制作一个表白网站视频,关于勇敢表白的小标题?  Android滚轮选择时间控件使用详解  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  如何用虚拟主机快速搭建网站?详细步骤解析  网站制作价目表怎么做,珍爱网婚介费用多少?  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  香港服务器WordPress建站指南:SEO优化与高效部署策略  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  如何基于PHP生成高效IDC网络公司建站源码?  html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  Swift开发中switch语句值绑定模式  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  如何批量查询域名的建站时间记录?  如何用AI帮你把自己的生活经历写成一个有趣的故事?  公司门户网站制作流程,华为官网怎么做?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  Python文件流缓冲机制_IO性能解析【教程】  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  如何在局域网内绑定自建网站域名?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  中山网站推广排名,中山信息港登录入口?  如何在腾讯云服务器上快速搭建个人网站?  青岛网站建设如何选择本地服务器?  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  HTML 中如何正确使用模板变量为元素的 name 属性赋值  Laravel如何使用Seeder填充数据_Laravel模型工厂Factory批量生成测试数据【方法】  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能  详解Huffman编码算法之Java实现  原生JS实现图片轮播切换效果  七夕网站制作视频,七夕大促活动怎么报名?  如何快速上传建站程序避免常见错误?  如何破解联通资金短缺导致的基站建设难题?  如何快速搭建二级域名独立网站?  轻松掌握MySQL函数中的last_insert_id()  Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】