es6的set、map

ES6加入Set和Map是为了弥补ES5单集合类型的缺点,为了进行非数值类型的索引。
Set:不包含重复值的列表。
Map:键值对的集合。
ES5有模拟set、map的使用,但是存在弊端:
1.如果存在一个数值键5和一个字符键5,在进行索引值的时候着两者都是指向的字符5的值,对象转换为默认的字符串的表现形式,时的对象很难被当作Map的键。
2.在需要布尔值的时候:

let map = Object.create(null);
map.count = 1;
// 是想检查 "count" 属性的存在性,还是想检查非零值?
if (map.count) {
// ...
}

Set:
1.new Set():创建Set、添加项目

let set = new Set();
set.add(5);
set.add("5");
console.log(set.size); //

set中5、'5’可以同时存在的,但是+0、-0是相等的,添加时会被合并。
Set 构造器实际上可以接收任意可迭代对象作为参数。
2.has():判断是否存在这个值

let set = new Set();
set.add(5);
set.add("5");
console.log(set.has(5)); // true
console.log(set.has(6)); // false

3.delete()\clear():删除单个值、清除所有值

let set = new Set();
set.add(5);
set.add("5");
console.log(set.has(5)); // true
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

4.set中的forEach
set的foreach由于没有索引,所以它的值和键都用的值以确保和数组foreach方法的一致性。
forEach() 方法会被传递一个回调函数,该回调接受三个参数:

  1. Set 中下个位置的值;
  2. 与第一个参数相同的值;
  3. 目标 Set 自身。
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

5.set转换为数组
利用扩展运算符…

let set = new Set([1, 2, 3, 3, 3, 4, 5]),
array = [...set];
console.log(array); // [1,2,3,4,5]

由于 Set 类型存储对象引用的方式,它也可以被称为 Strong Set 。对象存储在 Set 的一个实例中时,实际上相当于把对象存储在变量中。只要对于 Set 实例的引用仍然存在,所存储的对象就无法被垃圾回收机制回收,从而无法释放内存。
Weak Set:
该类型只允许存储对象弱引用,而不能存储基本类型的值。对象的弱引用在它自己成为该对象的唯一引用时,不会阻止垃圾回收。
1.创建Weak Set

let set = new WeakSet(),
key = {};
// 将对象加入 set
set.add(key);
console.log(set.has(key)); // true
set.delete(key);
console.log(set.has(key)); // false

2.WeakSet构造器不接受基本类型的值,否则会报错。has、delete会返回false

let key1 = {},
key2 = {},
set = new WeakSet([key1, key2]);
console.log(set.has(key1)); // true
console.log(set.has(key2)); // true

如果你用has方法去测试,那么引用不会消失

let set = new WeakSet(),
key = {};
// 将对象加入 set
set.add(key);
console.log(set.has(key)); // true
// 移除对于键的最后一个强引用,同时从 Weak Set 中移除
key = null;

Weak Set 不可迭代,因此不能被用在 for-of 循环中;
Weak Set 无法暴露出任何迭代器(例如 keys() 与 values() 方法),因此没有任何编程手段可用于判断 Weak Set 的内容;
Weak Set 没有 forEach() 方法;
Weak Set 没有 size 属性。

Map
1.创建Map
ES6 的 Map 类型是键值对的有序列表,而键和值都可以是任意类型。键的比较使用的是Object.is() ,因此你能将 5 与 “5” 同时作为键,因为它们类型不同。
调用 set() 方法并给它传递一个键与一个关联的值,来给 Map 添加项;此后使用键名来调用 get() 方法便能提取对应的值。

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

由于这些键不会被强制转换成其他形式,每个对象就都被认为是唯一的。这允许你给对象关联额外数据,而无须修改对象自身。
2.Map的方法
has(key) :判断指定的键是否存在于 Map 中;
delete(key) :移除 Map 中的键以及对应的值;
clear() :移除 Map 中所有的键与值。
size属性:指明包含多少键值对。
3.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

4.Map上的forEach方法
forEach() 方法会被传递一个回调函数,该回调接受三个参数:

  1. Map 中下个位置的值;
  2. 该值所对应的键;
  3. 目标 Map 自身。
let map = new Map([ ["name", "Nicholas"], ["age", 25]]);
map.forEach(function(value, key, ownerMap) {
console.log(key + " " + value);
console.log(ownerMap === map);
});

Weak Map
Weak 版本都是存储对象弱引用的方式。在 Weak Map 中,所有的键都必须是对象(尝试使用非对象的键会抛出错误),而且这些对象都是弱引用,不会干扰垃圾回收。
Weak Map 的最佳用武之地,就是在浏览器中创建一个关联到特定 DOM 元素的对象。例如,某些用在网页上的 JS 库会维护一个自定义对象,用于引用该库所使用的每一个 DOM 元素,并且其映射关系会存储在内部的对象缓存中。
该方法的困难之处在于:如何判断一个 DOM 元素已不复存在于网页中,以便该库能移除此元素的关联对象。若做不到,该库就会继续保持对 DOM 元素的一个无效引用,并造成内存泄漏。使用 Weak Map 来追踪 DOM 元素,依然允许将自定义对象关联到每个 DOM 元素,而在此对象所关联的 DOM 元素不复存在时,它就会在 Weak Map 中被自动销毁。
ES6 的 WeakMap 类型是键值对的无序列表,其中键必须是非空的对象,值则允许是任意类型。 WeakMap 的接口与 Map 的非常相似,都使用 set() 与 get() 方法来分别添加与提取数据:

let map = new WeakMap(),
element = document.querySelector(".element");
map.set(element, "Original");
let value = map.get(element);
console.log(value); // "Original"
// 移除元素
element.parentNode.removeChild(element);
element = null;
// 该 Weak Map 在此处为空
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值