ES6之Map使用体会

什么是Map

作为 ES6 的新增特性,Map 是一种新的集合类型,为这门语言带来了真正的键/值存储机制。

基本操作

创建-new Map

javascript 复制代码
const m = new Map()

const m1 = new Map([
  ['key1','value1'],
  ['key2','value2'],
  ['key3','value3']
])

增/改-set

c 复制代码
m1.set('key4','value4')

查-get/has

csharp 复制代码
m1.get('key1')// 'value1'
m1.has('key1')// true

删-delete/clear

go 复制代码
m1.delete('key1')// 只删除此键值对
m1.clear()// 清除所有键值对

获取键值对数量-size

arduino 复制代码
m1.size

遍历与其他操作

常规遍历(for遍历)

javascript 复制代码
// for遍历
for (let [key, value] of m) {
  console.log(key, value);
}
for (let key of m.keys()) {
  console.log(key);
}
for (let value of m.values()) {
  console.log(value);
}

map转数组

tips: 转数组之后就可以愉快的使用数组操作了

css 复制代码
[...m] // [ [ 'key1', 'value1' ], [ 'key2', 'value2' ], [ 'key3', 'value3' ] ]
[...m.keys()] // ['key1', 'key2', 'key3']
[...m.values()] // ['value1', 'value2', 'value3']

map与对象互转

javascript 复制代码
// map转对象方法
function strMapToObj(strMap) {
  let obj = Object.create(null);
  for (let [k, v] of strMap) {
    obj[k] = v;
  }
  return obj;
}
// 对象转map
new Map(Object.entries({}));

forEach()

ini 复制代码
m.forEach((value, key, map) => {
  console.log(value, key, map);
});
//value1 key1 Map(3) { 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3' }
// value2 key2 Map(3) { 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3' }
// value3 key3 Map(3) { 'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value3' }

filter

javascript 复制代码
new Map([...m].filter(([k, v]) => ...));

Map vs Object

Map和Object的使用在大多数情况下没有太大的区别,但是细究其性能以及内存占用,两者还是有些许差异的。下表可以一览二者的区别。

对比项 Map Object
键名 各种类型的值(包括对象)都可以当作键 传统上只能用字符串当作键
顺序 有序 无序
内存占用 不同浏览器的情况不同,但给定固定大小的内存,Map 大约可以比 Object 多存储 50%的键/值对。 不同浏览器的情况不同,但给定固定大小的内存,Object大约可以比Map少存储50%的键/值对。
插入性能 稍快 稍慢
查找速度 键值对多:差异极小键值对少:比Object慢 键值对多:差异极小键值对少:比Map快
删除性能 对大多数浏览器引擎来说,Map 的 delete()操作都比插入和查找更快。 Map的删除性能明显优于Object。 使用 delete 删除 Object 属性的性能一直以来饱受诟病

总的来说,除了在查找速度上Object表现稍微优于Map,在内存占用,插入及删除性能等都是Map优于Object的。基于这些特点,我们可以在今后的开发中有选择地使用Map和Object。

在把 Object 当成数组使用的情况下(比如使用连续整数作为属性),浏览器引擎可以进行优化,在内存中使用更高效的布局。这对 Map 来说是不可能的。对这两个类型而言,查找速度不会随着键/值对数量增加而线性增加。如果代码涉及大量查找操作,那么某些情况下可能选择 Object 更好一些。

相关推荐
_揽13 分钟前
html如何在一张图片上的某一个区域做到点击事件
前端·html
踢足球的,程序猿16 分钟前
从 Vue 2.0 进阶到 Vue 3.0 的核心技术解析指南
前端·javascript·vue.js·前端框架·html
冷凌爱18 分钟前
Fetch与Axios:区别、联系、优缺点及使用差异
前端·node.js·js
袁煦丞40 分钟前
跨平台终端王者Tabby:cpolar内网穿透实验室第632个成功挑战
前端·程序员·远程工作
Sailing42 分钟前
Grafana-mcp-analyzer:基于 MCP 的轻量 AI 分析监控图表的运维神器!
前端·node.js·mcp
阿山同学.1 小时前
AWS 亚马逊 S3存储桶直传 前端demo 复制即可使用
前端·javascript·aws
Jolyne_1 小时前
grid 实现完美的水平铺满、间隔一致的自适应布局
前端·css
sunly_1 小时前
Flutter:导航固定背景图,滚动时导航颜色渐变
android·javascript·flutter
西洼工作室1 小时前
【解决导航栏字体图标渲染导致文本闪烁问题】采用腾讯视频的解决方案
前端·css·css3
摸鱼仙人~1 小时前
深入理解Java单例模式:确保类只有一个实例
java·javascript·单例模式