ES6--(7) Set与Map

ES5 中的 Set 与 Map

    Set 与 Map 并不正式存在于 ES5 中。一般会使用对象来模拟 Set 和 Map 。

set
map

变通方法的问题

    由于对象属性的类型必须为字符串,就必须保证任意两个键不能被转换为相同的字符串。比如数字和数字组成的字符串、两个对象等。

ES6 的 Set

    ES6 新增了 Set 类型,这是一种无重复值的有序列表。 Set 允许对它包含的数据进行快速访问,从而增加了一个追踪离散值的更有效方式。

创建 Set 并添加项目

    Object.is()方法来判断两个值是否相等的,所以不会强制转换。(对象与之相同)

    可以使用 has() 方法来测试某个值是否存在于 Set 中。

移除值

    可以使用 delete() 方法来移除单个值,或调用 clear() 方法来将所有值从 Set 中移除。

Set 上的 forEach() 方法

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

        1. Set 中下个位置的值;

        2. 与第一个参数相同的值;

        3. 目标 Set 自身。

key与value相等

如果想在回调函数中使用this,可以在forEach()中传入第二个参数this。或者使用箭头函数。

将 Set 转换为数组

    Set 无法通过索引来访问某个值。不过可以将其转化成数组,利用扩展运算符...

数组去重

Weak Set

    对象存储在 Set 的一个实例中时,实际上相当于把对象存储在变量中。只要对于 Set 实例的引用仍然存在,所存储的对象就无法被垃圾回收机制回收,从而无法释放内存。

    ES6 也包含了 Weak Set ,该类型只允许存储对象弱引用,而不能存储基本类型的值。对象的弱引用在它自己成为该对象的唯一引用时,不会阻止垃圾回收。

创建 Weak Set

Set 类型之间的关键差异

    Weak Set 与正规 Set 之间最大的区别是对象的弱引用。若只想追踪对象的引用,应当使用 Weak Set 而不是正规 Set 。

        1. 对于 WeakSet 的实例,若调用 add() 方法时传入了非对象的参数,就会抛出错误(has() 或 delete() 则会在传入了非对象的参数时返回 false );

        2. Weak Set 不可迭代,因此不能被用在 for-of 循环中;

        3. Weak Set 无法暴露出任何迭代器(例如 keys() 与 values() 方法),因此没有任何编程手段可用于判断 Weak Set 的内容;

        4. Weak Set 没有 forEach() 方法;

        5. Weak Set 没有 size 属性。

ES6 的 Map

    ES6 的 Map 类型是键值对的有序列表,而键和值都可以是任意类型。键的比较使用的是Object.is()。

    set() 方法并给它传递一个键与一个关联的值,来给 Map 添加项; get() 方法便能提取对应的值。

Map 的方法

        has(key) :判断指定的键是否存在于 Map 中;

        delete(key) :移除 Map 中的键以及对应的值;

        clear() :移除 Map 中所有的键与对应的值。

        size 属性,用于指明包含了多少个键值对

Map 的初始化

Map 上的 forEach 方法

    三个参数的回调函数:

        1. Map 中下个位置的值;

        2. 该值所对应的键;

        3. 目标 Map 自身。

Weak Map

    在 Weak Map 中,所有的键都必须是对象(尝试使用非对象的键会抛出错误),而且这些对象都是弱引用,不会干扰垃圾回收。当 Weak Map 中的键在 Weak Map 之外不存在引用时,该键值对会被移除。

使用 Weak Map

Weak Map 的初始化

Weak Map 的方法

    Weak Map 只有两个附加方法能用来与键值对交互。has() 与 delete() 方法。

对象的私有数据

    Weak Map 的一个实际应用就是在对象实例中存储私有数据。

Weak Map 的用法与局限性

    是否使用非对象的键。

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

推荐阅读更多精彩内容