共计 2077 个字符,预计需要花费 6 分钟才能阅读完成。
引子
“键值对”的数据结构,之前基本上都是应用 {}
,新的标准中有更适合的抉择了。
上一篇 JavaScript 新旧替换五:函数嵌套。
- Origin
- My GitHub
ES5 形式
根本用法
应用 {}
存储键值对,键的类型只反对两种:String
和 Symbol
。
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-in
,for-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) // true
console.log(m.delete('age')) // false
其它
has(key)
: 判断是否有键key
。clear()
: 革除所有成员。
遍历
遍历的罕用办法有:forEach
,for-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
类型的键也能够遍历到。
区别
维度 | Map | Object |
---|---|---|
意外的键 | 默认状况不蕴含任何键,只蕴含显式插入的键。 | 原型链上的键名有可能与设置的键名产生抵触。 |
键的类型 | 键能够是任意值。 | 键必须是一个 String 或 Symbol。 |
键的程序 | 有序 | 无序 |
键的统计 | 通过 size 属性获取 | 要手动计算 |
迭代 | Map 能够间接被迭代。 | 以某种形式(例如 Object.keys(obj))解决后能力迭代。 |
性能 | 在频繁增删键值对的场景下体现更好。 | 在频繁增删除键值对的场景下未作优化。 |
参考资料
- Map MDN
- WeakMap MDN
- Map
正文完
发表至: javascript
2020-10-24