Set
Set 是不包含重复值的列表。常见的Set使用场景是检查某个值是否存在.
Set实例需要用new Set()来创建,Set 构造器实际上可以接收任意可迭代对象作为参数。构造器会使用迭代器来提取参数中的值。
Set 不会使用强制类型转换来判断值是否重复。这意味着 Set 可以同时包含数值 5 与 字符串 "5" ,将它们都作为相对独立的项
Set方法:
- add() 向Set中添加项目
- size() 检查Set中有多少项
- delete() 移除值
- has() 判断值是否存在,返回布尔值
- clear() 清空Set
- forEach() 遍历Set项,需要传入一个回调函数,该函数接受3个参数:1.Set中下个位置的值,2.与第一个参数相同的值(为了与Map,数组里的forEach函数保持参数一致) 3.目标Set自身
WeakSet
为了解决大型项目中的内存泄漏,引入了该对象。
该类型只允许存储对象弱引用,而不能存储基本类型的值。
Weak Set 与 Set 关键的差异:
- 对于 WeakSet 的实例,只要调用 add() 、 has() 或 delete() 方法时传入了非对象的参数,就会抛出错误;
- Weak Set 不可迭代,因此不能被用在 for-of 循环中;
- Weak Set 无法暴露出任何迭代器(例如 keys() 与 values() 方法),因此没有任何编程手段可用于判断 Weak Set 的内容;
- Weak Set 没有 forEach() 方法;
- Weak Set 没有 size 属性。
Map
Map 是键与相对应的值的集合。通过指定所需读取的键即可检索对应的值。 Map 常被用作缓存,存储数据以便此后快速检索。类型是键值对的有序列表,而键和值都可以是任意类型。
size属性表示map中的键值对数量
Map初始化
将数组传递给 Map 构造器,以便使用数据来初始化一个 Map 。该数组中的每一项也必须是数组,内部数组的首个项会作为键,第二项则为对应值。因此整个 Map 就被这些双项数组所填充。
let map = new Map([["name", "Polo"], ["age", 30]]);
console.log(map.has("name")); // true
console.log(map.get("name")); // "Polo"
console.log(map.has("age")); // true
console.log(map.get("age")); // 30
console.log(map.size); // 2
Map方法:
- set(key,val) 设置键值对
- get(key) 获得key对应的值
- has(key) 判断key是否存在
- delete(key) 删除key及对应的值
- clear() 清空map
- forEach(cb) cb是一个能接收三个参数的回调函数 1.Map中下个位置的值,2.值对应的key,3.目标Map自身
let map = new Map([ ["name", "Nicholas"], ["age", 25]]);
map.forEach(function(value, key, ownerMap) {
console.log(key + " " + value);
console.log(ownerMap === map);
});
WeakMap
WeakMap是存储对象弱引用的方式。所有的键都必须是对象,使用非对象的键会抛出错误,而且这些对象都是弱引用,不会干扰垃圾回收。。当 Weak Map 中的键在 Weak Map 之外不存在引用时,该键值对会被移除。
Weak Map 只有两个附加方法能用来与键值对交互。 has() 方法用于判断指定的键是否存在于 Map 中,而 delete() 方法则用于移除一个特定的键值对。不能clear,也不能forEach,因为不可迭代
可以利用WeakMap在对象实例中存储私有数据。举例如下:
let Person = (function() {
let privateData = new WeakMap();
function Person(name) {
privateData.set(this, { name: name });
}
Person.prototype.getName = function() {
return privateData.get(this).name;
};
return Person;
}());
此版本的 Person 范例使用了 Weak Map 而不是对象来保存私有数据。
当 Person 构造器被调用时,将 this 作为键在 Weak Map 上建立了一个入口,而包含私有信息的对象成为了对应的值,其中只存放了 name 属性。通过将 this 传递给 privateData.get() 方法,以获取值对象并访问其 name 属性, getName() 函数便能提取私有信息。这种技术让私有信息能够保持私有状态,并且当与之关联的对象实例被销毁时,私有信息也会被同时销毁。