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 严格按引用或值比较:
-
Map中new Map().set({}, 'a').set({}, 'b')确实存了两个不同键 - 数字
1和字符串'1'在Map中是不同键;在Object中,obj[1]和obj['1']访问的是同一个属性 -
undefined、null、NaN都可作为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(还要防原型链),要么转成数组再操作,多一层转换开销。
另外:Map 的 set()、get()、has()、delete() 时间复杂度都是平均 O(1),而 Object 的属性访问虽快,但涉及动态原型链查找或隐藏类变更时,性能边界不如 Map 可控。
什么时候该用 Map,而不是 Object?
不是“哪个更好”,而是“哪个更合适”。以下情况优先选 Map:
- 键不确定类型,比如来自用户输入、DOM 元素、函数、其他对象
- 需要频繁增删键值对,且关心操作顺序或迭代一致性
- 用
NaN或0做键(Object里obj[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浏览器插件安装失败【解决方法】

