JavaScript的对象有个问题,键key必须是字符串。但实际上Number或者其他数据类型作为键也是非常合理的。
为了解决这个问题,最新的ES6规范引入了新的数据类型 Map。
//如果用 Array 实现,需要两个 Array
//给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,Array越长,耗时越长。
var names = [‘Michael‘, ‘Bob‘, ‘Tracy‘];
var scores = [95, 75, 85];
//使用Map
var m = new Map([[‘Michael‘, 95], [‘Bob‘, 75], [‘Tracy‘, 85]]);
console.log(m.get(‘Michael‘)); // 95
var m = new Map(); // 空Map
m.set(‘Adam‘, 67); // 添加新的key-value
m.has(‘Adam‘); // 是否存在key ‘Adam‘: true
m.get(‘Adam‘); // 67
m.delete(‘Adam‘); // 删除key ‘Adam‘
m.get(‘Adam‘); // undefined
//由于一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉
var m = new Map();
m.set(‘Adam‘, 67);
m.set(‘Adam‘, 88);
m.get(‘Adam‘); // 88
//自动过滤相同的元素
var s = new Set([1, 2, 3, 3, ‘3‘]);
s; // Set {1, 2, 3, "3"}
Set的常用方法
//通过 add(key) 方法可以添加元素到 Set 中,可以重复添加,但不会有效果
s.add(4);
s; // Set {1, 2, 3, 4}
s.add(4);
s; // 仍然是 Set {1, 2, 3, 4}
//通过 delete(key) 方法可以删除元素
var s = new Set([1, 2, 3]);
s; // Set {1, 2, 3}
s.delete(3);
s; // Set {1, 2}
遍历Map 和 Set,无法像数组一样遍历下标
为了统一集合类型,ES6标准引入了新的 iterable 类型,Array,Map,Set
具有 iterable 类型的集合可以通过forEach 循环来遍历
var a = [‘A‘, ‘B‘, ‘C‘];
var s = new Set([‘A‘, ‘B‘, ‘C‘]);
var m = new Map([[1, ‘x‘], [2, ‘y‘], [3, ‘z‘]]);
//以 Array 为例:
a.forEach(function (element, index, array) {
// element: 指向当前元素的值
// index: 指向当前索引
// array: 指向Array对象本身
console.log(element + ‘, index = ‘ + index);
});
//Set 没有索引,因此回调函数的前两个参数都是元素本身
var s = new Set([‘A‘, ‘B‘, ‘C‘]);
s.forEach(function (element, sameElement, set) {
console.log(element); //A B C
});
//Map 的回调函数参数依次为 value 、 key 和 map 本身
var m = new Map([[1, ‘x‘], [2, ‘y‘], [3, ‘z‘]]);
m.forEach(function (value, key, map) {
console.log(value); // x y z
});
原文:https://www.cnblogs.com/saxonsong/p/14754373.html