
Javascript中Map与Object的区别
发布日期:2021-05-04 18:17:13
浏览次数:42
分类:原创文章
本文共 1467 字,大约阅读时间需要 4 分钟。
典型的区别
Map可以将任何数据类型作为key,而Object,只能使用String或者Symbol。
一个 Map的键可以是任意值,包括函数、对象或任意基本类型。
const map = new Map();map.set(NaN, 'NaN'); map.get(NaN) // NaNmap.set(null, 'null'); map.get(null) // nullmap.set(undefined, '未定义'); map.get() // 未定义
Map的键是按插入顺序排序的,而Object并非总是按插入顺序
实际上Object的key顺序也是有规则(或说有顺序)的。可以理解为键的排序分为三组,各自排序:
- 数值类型,比如’1’, ‘2’
- 字符串类型, 比如’foo’, ‘bar’
- Symbol类型
每组内按插入顺序排序,比如
const obj = { };obj.b = 'b';obj.a = 'a';obj[1] = 1;obj[Symbol('foo')] = 'symbol foo';obj[2] = 2;obj[Symbol('bar')] = 'symbol bar';console.log(obj)// {1: 1, 2: 2, b: "b", a: "a", Symbol(foo): "symbol foo", Symbol(bar): "symbol bar"}
细微的差别
- Map实现了
Iterator
接口,可以直接使用for of
进行遍历。而Object需要使用Object.entries()
等类似的方法 - Map可以直接使用
size
方法得到entries的长度,而Object由于在创建的时候包含的原型属性,固求长度需要单独处理
性能差别
Map相对于Obj还是快的:
const benchmarkMap = size => { console.time('benchmarkMap'); var map = new Map(); for (var i = 0; i < size; i++) map.set(i+'s', i); for (var i = 0; i < size; i++) var x = map.get(i+'s'); console.timeEnd('benchmarkMap');}const benchmarkObj = size => { console.time('benchmarkObj'); var obj = { }; for (var i = 0; i < size; i++) obj[i+'s'] = i; for (var i = 0; i < size; i++) var x = obj[i+'s']; console.timeEnd('benchmarkObj');}var size = 1000000;benchmarkMap(size);benchmarkObj(size);// 结果 benchmarkMap: 764.6181640625 msbenchmarkObj: 1443.76806640625 ms// 值得注意的是,之所以key是i+'s'是因为,Object对key是数字的情况做了优化。
MDN还提到在频繁增删的情况下Map表现会更好:
Map: 在频繁增删键值对的场景下表现更好。
Object: 在频繁添加和删除键值对的场景下未作出优化。
参考
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年03月20日 00时56分18秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
python中的map( )函数及lambda()函数简介
2019-03-04
2020-05-26-力扣刷刷4-面试题10- I. 斐波那契数列
2019-03-04
SQL Sever 学习笔记三——聚合查询
2019-03-04
SQL Sever学习笔记四——分组—GROUP BY 子句
2019-03-04
深度优先遍历(DFS)和广度优先遍历(BFS)
2019-03-04
机器学习笔记一——常用优化算法—GD、BGD、SCD、MBGD
2019-03-04
轮播图——旋转木马(Jquery)
2019-03-04
普通平衡树板子
2019-03-04
操作DOM(二):删除节点、、复制节点、替换节点
2019-03-04
刷题笔记--树的遍历
2019-03-04
爬虫(5)—— 获取中国大学排名
2019-03-04
爬虫(4)—— Beautiful Soup
2019-03-04
关于mysql路径下找不到my.ini配置文件
2019-03-04
JavaScript数组(1):定义数组、使用数组
2019-03-04
vue(4):计算属性、监听属性
2019-03-04
vue(7):表单输入绑定
2019-03-04
JSP内置对象:操作cookie、session对象
2019-03-04
vue(8):组件基础(1)
2019-03-04
【数算-27】多路查找树【了解】
2019-03-04