ES6 Demos(七) Sets and Maps(Set与Map)
ES6 向 JS 添加了 Set 与 Map。ES5可以通过对象来进行模拟,set主要用来检查键的存在性。map多数被用来提取数据。
Demo1: ES5模拟set遇到的一个问题
let map = Object.create(null);
map.count = 0;
// 是想检查 "count" 属性的存在性,还是想检查非零值?
if (map.count) {
// ...
}
Demo2: ES6的Set
ES6 新增了 Set 类型,这是一种无重复值的有序列表。 Set 允许对它包含的数据进行快速访问,从而增加了一个追踪离散值的更有效方式。
Set 使用 new Set() 来创建,而调用 add() 方法就能向 Set 中添加项目,检查 size 属性还能查看其中包含有多少项
let set = new Set();
//Set 不会使用强制类型转换来判断值是否重复。这意味着 Set 可以同时包含数值 5 与 字符串 "5" ,将它们都作为相对独立的项
set.add(5);
set.add("5");
//如果 add() 方法用相同值进行了多次调用,那么在第一次之后的调用实际上会被忽略
set.add(5); // 重复了,该调用被忽略
console.log(set.size); // 2
//你可以使用数组来初始化一个 Set ,并且 Set 构造器会确保不重复地使用这些值
let set2 = new Set([1, 2, 3, 4, 5, 5, 5, 5]);
console.log(set2.size); // 5
//你可以使用 has() 方法来测试某个值是否存在于 Set 中
console.log(set.has(5)); // true
console.log(set.has(6)); // false
//移除值
set.delete(5);
console.log(set.has(5)); // false
console.log(set.size); // 1
set.clear();
console.log(set.has("5")); // false
console.log(set.size); // 0
总结Set: 可区分5和“5”, 可去重, 用has来检测,用clear/delete来移除值
Demo2-1: Set 上的 forEach() 方法
//数组调用forEach
let array1 = ['sunny','stella','sheldon'];
array1.forEach(function(value, index, own){
console.log(value); //'sunny','stella','sheldon'
console.log(index); // 0, 1, 2
console.log(own); //array1本身
});
//Set调用forEach
let set1 = new Set(['sunny','stella','sheldon']);
// 将 Set 中的每一项同时认定为键与值。于是为了让 Set 的
// forEach() 方法与数组及 Map 版本的保持一致,该回调函数的前两个参数就始终相同了
set1.forEach(function(value, index, own){
console.log(value); //'sunny','stella','sheldon'
console.log(index); //'sunny','stella','sheldon'
console.log(own); //array1本身
});
Demo2-2: Set与数组相互转换
let set = new Set([1, 2, 3, 3, 3, 4, 5]),
array = [...set];
console.log(array); // [1,2,3,4,5]
//使用这个方法可以进行数组去重
Demo2-3: WeakSet (不常用,暂略)
Set 是无重复值的有序列表。根据 Object.is() 方法来判断其中的值不相等,以保证无重复。 Set 会自动移除重复的值,因此你可以使用它来过滤数组中的重复值并返回结果。 Set并不是数组的子类型,所以你无法随机访问其中的值。但你可以使用 has() 方法来判断某个值是否存在于 Set 中,或通过 size 属性来查看其中有多少个值。 Set 类型还拥有forEach() 方法,用于处理每个值。
Demo3: ES6 的 Map
let map = new Map();
map.set("title", "Understanding ES6");
map.set("year", 2016);
console.log(map.get("title")); // "Understanding ES6"
console.log(map.get("year")); // 2016
//如果任意一个键不存在于 Map 中, 则 get() 方法就会返回特殊值 undefined 。
// 以下三个方法在 Map 与 Set 上都存在:
// has(key) :判断指定的键是否存在于 Map 中;
// delete(key) :移除 Map 中的键以及对应的值;
// clear() :移除 Map 中所有的键与值。
// Map 同样拥有 size 属性,用于指明包含了多少个键值对
//Map可以一次性进行填充
let map = new Map([["name", "Nicholas"], ["age", 25]]);
console.log(map.has("name")); // true
console.log(map.get("name")); // "Nicholas"
console.log(map.has("age")); // true
console.log(map.get("age")); // 25
console.log(map.size); // 2
Demo3-1: Map 上的 forEach() 方法
let map1 = new Map([[5,'sunny'], ['5','stella'], [6,'sheldon']]);
map1.forEach(function(value, index, own){
console.log(value); //'sunny','stella','sheldon'
console.log(index); //5,5,6
console.log(own); //map1本身
});
Demo3-2: Map Weak Map(不常用,暂略)
Map 是有序的键值对,其中的键允许是任何类型。与 Set 相似,通过调用 Object.is() 方法来判断重复的键,这意味着能将数值 5 与字符串 "5" 作为两个相对独立的键。使用set() 方法能将任何类型的值关联到某个键上,并且该值此后能用 get() 方法提取出来。Map 也拥有一个 size 属性与一个 forEach() 方法,让项目访问更容易。