ES6学习笔记--Set与Map

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() 函数便能提取私有信息。这种技术让私有信息能够保持私有状态,并且当与之关联的对象实例被销毁时,私有信息也会被同时销毁。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335

推荐阅读更多精彩内容