ES6(七)Set与Map1
1.ES5 中的 Set 与 Map
ES6的SET
2.创建 Set 并添加项目
3.移除值
4.处理数组中的每一项foreach()
5.将 Set 转换为数组
ES5 中的 Set 与 Map
let set = Object.create(null);
let set1 = Object.create({});
set.foo = true;
console.log(set, set1);
// 检查属性的存在性
if (set.foo) {
// 一些操作
}
let map = Object.create(null);
map.foo = "bar";
// 提取一个值
let value = map.foo;
console.log(map, value);
与 Set 不同, Map 多数被用来提取数据,而 不是仅检查键的存在性。
创建 Set 并添加项目
let set = new Set(),
key1 = {}
key2 = {};
set.add('001');
set.add('AAA')
set.add(key1);
set.add(key2);
set.add(5);
set.add("5");
set.add(5); // 重复了,会被忽略
console.log(set, set.size);
// 用has()来判断是否存在
console.log(set.has(2)); // f
console.log(set.has(5)); // t
console.log(set.has('5')); //t
let set2 = new Set([1, 2, 3, 4, 5,5, 5, 5, 5]);
console.log(set2.size); // 6
// 不重复统计
移除值
delete() 方法来移除单个值,
clear() 方法 来移除所有值
let set = new Set();
set.add(5);
set.add("5");
set.add("123");
console.log(set.has(5));
set.delete(5);
console.log(set.has(5));
console.log(set);
set.clear();
console.log(set, set.size);
对每个项执行一些操作: forEcah()
处理数组中的每一项
foreach()
let set = new Set([1, 2]);
set.forEach(function(value, key, ownerSet) {
console.log(key + " " + value);
console.log(ownerSet === set);
});
// 1 1
// true
// 2 2
// true
let set1 = new Set(['a', 'b']);
set1.forEach((index, value, item) => {
console.log(index, value, item, item === set1);
})
// a a Set(2) {"a", "b"} true
// b b Set(2) {"a", "b"} true
在回调函数中使用 this ,你可以给forEach() 传入一个 this值作为第二个参数
let set = new Set([1, 2]);
let processor = {
output(value) {
console.log(value);
},
process(dataSet) {
dataSet.forEach(function(value) {
this.output(value);
}, this);
}
};
processor.process(set);
// 1
// 2
使用箭头函数来达到相同效果,而无须传入第二个参数
let set = new Set([1, 2]);
let processor = {
output(value) {
console.log(value);
},
process(dataSet) {
dataSet.forEach((value) => this.output(value));
}
};
processor.process(set);
// 1
// 2
Set能非常好地追踪值,并且 forEach() 可以让你按顺序处理每一项,但是却 无法像数组那样用索引来直接访问某个值。如果你想这么做,最好的选择是将 Set 转换为数 组。
将 Set 转换为数组
数组 => Set, 以将数组传递给 Set 构造器,
Set => 数组, 扩展运算符( ... )
let set = new Set([1, 2, 3, 3, 3, 4, 5]),
array = [...set];
console.log(array); // [1, 2, 3, 4, 5]
Set清除了重复值之后,将数据复制到了新数组。
由于 Set 类型存储对象引用的方式,它也可以被称为 Strong Set 。对象存储在 Set 的一个 实例中时,实际上相当于把对象存储在变量中。只要对于 Set 实例的引用仍然存在,所存储 的对象就无法被垃圾回收机制回收,从而无法释放内存。
let set = new Set(),
key = {},
key1 = 'abc';
set.add(key);
set.add(key1);
console.log(set.size, set);
key = null;
key2 = '123'
key3 = null;
set.add(key3);
console.log(set.size, set);
本来应该是赋值为null时取消引用,但实际还是被引用的
使用 Weak Set 很像在使用正规的 Set:
add() 方法、
has() 方法
delete() 方法
let set = new WeakSet(),
key = {};
// 将对象加入 set
set.add(key);
console.log(set.has(key)); // t
set.delete(key);
console.log(set.has(key)); // f