引子

“键值对”的数据结构,之前基本上都是应用 {} ,新的标准中有更适合的抉择了。

上一篇 JavaScript 新旧替换五:函数嵌套。

  • Origin
  • My GitHub

ES5 形式

根本用法

应用 {} 存储键值对,键的类型只反对两种:StringSymbol

const obj1 = {1:'1'};const obj2 = {'name':'Tom'};const mark = Symbol('age');const obj3 = {[mark]:19};console.log(obj1);console.log(obj2);console.log(obj3);

后果

下面的 obj1 的键名尽管是一个数字,但会被转换为字符串。

操作

增加/批改

增加和批改应用 .[] 的形式:

const obj = {};obj.name = 'Tom';obj['name'] = 'Jim';

对于 Symbol 类型的键值,必须要用 [] 的形式才行。

读取

跟增加相似应用 .[] 的形式:

const mark = Symbol('age');const obj = {name:'Tom',};obj[mark] = 19;console.log(obj.name);console.log(obj[mark]);

删除

删除应用 delete 操作符:

const mark = Symbol('age');const obj = {name:'Tom',};obj[mark] = 19;delete obj.name;delete obj[mark];console.log(obj);

遍历

遍历的罕用办法有:for-infor-of

let obj = {name:'Tom',1:'1'};const mark = Symbol('age');obj[mark] = 19;for (const ele of Object.keys(obj)) {  console.log(ele);}// 1// name

这种数据结构的键是无序的,此外,键如果是 Symbol 类型,无奈被遍历。

ES2015+ 形式

为了解决上述键类型的问题,ES2015+ 中提供了 Map 数据结构。Map 构造提供了“值-值”的对应,更加适宜存储“键值对”。

根本用法

const m = new Map([  [1,'1'],  ['name','Tom'],  [Symbol('age'),19],  [{other:'play'},'basketball'],]);console.log(m);console.log(m.size);

后果

Map 数据结构根本属性 size 是成员的总数。

操作

增加/批改

set(key, value) 办法设置键 key 对应的值为 value ,并返回整个 Map 构造,因而能够链式调用。如果 key 曾经存在,则键值会被更新。

const m = new Map();m.set(1,'1').set('name','Tom');const mark = Symbol('age');m.set(mark,19);const obj = {other:'play'};m.set(obj,'basketball');console.log(m);

读取

get(key) 办法读取 key 对应的值,如果找不到 key ,返回 undefined

const m = new Map([  ['name','Tom'],]);const mark = Symbol('age');m.set(mark,19);console.log(m.get('name'));console.log(m.get(mark));

删除

delete(key) 办法删除键 key ,删除胜利则返回 true ,否则返回 false

const m = new Map([  ['name','Tom'],]);const result = m.delete('name');console.log(result) // trueconsole.log(m.delete('age')) // false

其它

  • has(key) : 判断是否有键 key
  • clear() : 革除所有成员。

遍历

遍历的罕用办法有: forEachfor-of

const m = new Map([  ['name','Tom'],  [1,'1'],  [Symbol('age'),19],  [{other:'play'},'basketball'],]);for (const ele of m.keys()) {  console.log(ele);}// name// 1// Symbol(age)// {other: "play"}

键名是有序的,Symbol 类型的键也能够遍历到。

区别

维度MapObject
意外的键默认状况不蕴含任何键,只蕴含显式插入的键。原型链上的键名有可能与设置的键名产生抵触。
键的类型键能够是任意值。键必须是一个 String 或 Symbol 。
键的程序有序无序
键的统计通过 size 属性获取要手动计算
迭代Map 能够间接被迭代。以某种形式(例如 Object.keys(obj))解决后能力迭代。
性能在频繁增删键值对的场景下体现更好。在频繁增删除键值对的场景下未作优化。

参考资料

  • Map MDN
  • WeakMap MDN
  • Map