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

js中Map和对象{}的区别

查看原文完整示例代码

1. 键的类型

Map - 键可以是任意类型

const map = new Map();// 各种类型的键都可以
map.set('string', '字符串键');
map.set(123, '数字键');
map.set(true, '布尔键');
map.set({}, '对象键');
map.set([], '数组键');
map.set(function() {}, '函数键');console.log(map.get(123)); // '数字键'

对象 - 键只能是字符串或 Symbol

const obj = {};obj['string'] = '字符串键'; // ✅
obj[123] = '数字键'; // 会被转换为字符串 "123"
obj[{}] = '对象键'; // 键会被转换为 "[object Object]"
obj[[1,2]] = '数组键'; // 键会被转换为 "1,2"console.log(obj);
// { "123": "数字键", "string": "字符串键", "[object Object]": "对象键", "1,2": "数组键" }

2. 顺序保证

Map - 保持插入顺序

const map = new Map();
map.set('z', 1);
map.set('a', 2);
map.set('m', 3);// 遍历时保持插入顺序
for (let [key, value] of map) {console.log(key); // z, a, m (插入顺序)
}

对象 - 不保证顺序(现代JS有改进但仍有差异)

const obj = {z: 1,a: 2,m: 3
};// 现代JS中字符串键通常按创建顺序,但有特殊情况
for (let key in obj) {console.log(key); // 顺序可能因JS引擎而异
}

3. 大小获取

Map - 有 size 属性

const map = new Map();
map.set('a', 1);
map.set('b', 2);console.log(map.size); // 2

对象 - 需要手动计算

const obj = { a: 1, b: 2 };
console.log(Object.keys(obj).length); // 2

4. 性能差异

// Map 在频繁增删时性能更好
const map = new Map();
const obj = {};// 添加大量数据测试
console.time('Map添加');
for (let i = 0; i < 100000; i++) {map.set(i, i);
}
console.timeEnd('Map添加');console.time('对象添加');
for (let i = 0; i < 100000; i++) {obj[i] = i;
}
console.timeEnd('对象添加');

5. 方法和特性对比

Map 方法

const map = new Map();map.set('key', 'value'); // 设置
map.get('key'); // 获取
map.has('key'); // 检查存在
map.delete('key'); // 删除
map.clear(); // 清空
map.forEach((value, key) => {}); // 遍历

对象方法

const obj = {};obj.key = 'value'; // 设置
obj.key; // 获取
'key' in obj; // 检查存在
delete obj.key; // 删除
Object.keys(obj).forEach(key => {}); // 遍历

6. 原型链问题

Map - 没有原型链干扰

const map = new Map();
console.log(map.get('toString')); // undefined

对象 - 有原型链

const obj = {};
console.log(obj.toString); // ƒ toString() { [native code] }// 安全创建无原型对象
const safeObj = Object.create(null);
console.log(safeObj.toString); // undefined

7. 序列化

对象 - 可 JSON 序列化

const obj = { a: 1, b: 2 };
console.log(JSON.stringify(obj)); // '{"a":1,"b":2}'

Map - 不能直接序列化

const map = new Map([['a', 1], ['b', 2]]);
console.log(JSON.stringify(map)); // '{}'// 需要转换
console.log(JSON.stringify([...map])); // '[["a",1],["b",2]]'

8. 使用场景总结

使用 Map 的情况:

  • 键类型多样(对象、函数等作为键)
  • 需要频繁增删键值对
  • 需要保持插入顺序
  • 大数据量操作

使用对象的情况:

  • 键都是字符串或 Symbol
  • 需要 JSON 序列化
  • 简单的配置、数据存储
  • 方法和属性的集合
// Map 适合的场景
const userSessions = new Map(); // 用户会话存储,键是用户对象// 对象适合的场景
const config = {apiUrl: 'https://api.example.com',timeout: 5000,retryCount: 3
};

选择依据:如果需要复杂键或高性能操作,用 Map;如果是简单数据结构,用对象。

希望这些信息能帮助您。如果还有其他想了解的,随时可以留言。

http://www.dtcms.com/a/549543.html

相关文章:

  • 基于python构建的低温胁迫实验
  • 服装公司网站修改wordpress后台登陆
  • 2025 Avalonia 技术全景:从版本迭代到生产级落地的成熟之路
  • 做网站却不给客户源代码奥迪互动平台
  • python基础一
  • Burp Suite 代理切换插件
  • 怎么做企业网站推广网站推广方案
  • Jaccard相似度:集合相似性的经典度量
  • 十七、STM32的TIM(八)(TIM输入捕获)
  • c语言笔记 格式化输出函数的使用
  • 网络营销网站建设哪家好北京发布重磅消息
  • 网站设计说明书范文WordPress表情包插件
  • 力扣1. 两数之和
  • Trait 对象与动态分发的权衡:Rust 多态性的代价与收益
  • 基于element-ui二次封装后的组件如何在storybook中展示
  • 零基础新手小白快速了解掌握服务集群与自动化运维(十六)集群部署模块——LVS负载均衡
  • C++面向对象与类和对象之旅(上)----C++重要基础入门知识
  • MR30系列分布式I/O在造型机产线的应用
  • 网站建设优化网站排名河北百度seo点击软件
  • 杭州做网站模板网络搭建基础教程
  • 虚拟机的未来:云计算与边缘计算的核心引擎(一)
  • ​​比亚迪秦新能源汽车动力系统拆装与检测实训MR软件介绍​
  • 仓颉编程(21)扩展
  • 网站建设方案书php做旅游网站
  • 强化网站建设和管理东莞企业建站程序
  • [人工智能-大模型-112]:用通俗易懂的语言,阐述代价函数Cost Function(误差函数、偏差函数、距离函数)
  • 跨平台矩阵如何高效排期?
  • 吴中区网站建设wordpress页面点赞
  • 网站建设需求文案案例html情人节给女朋友做网站
  • MATLAB频散曲线绘制与相速度/群速度分析