JavaScript学习之ES6 ES2015学记笔记(九)-集合(collection)

为什么要集合

JS中类集合的东西 对象(Object),纯粹的对象不可遍历。不能使用 for-of

Set

一个Set是一群值的集合,它是可变的,能够增删,但是与数组不同的是Set不包含相同元素

var settest = new Set("1,2,3,4,5");
console.log(settest.size);  //6
settest.add("1");
console.log(settest.size);  //6

Set的数据存储做了速度优化:

var arrayOFWords = [1,2,3,4,5];

console.log(arrayOFWords.indexOf(1)!==-1);  //慢
console.log(settest.has("1"));              //快

Set支持的操作:

  • new Set:创建一个新的、空的 Set。
  • new Set(iterable):从任何可遍历数据中提取元素,构造出一个新的集合。
  • set.size:获取集合的大小,即其中元素的个数。
  • set.has(value):判定集合中是否含有指定元素,返回一个布尔值。
  • set.add(value):添加元素。如果与已有重复,则不产生效果。
  • set.delete(value):删除元素。如果并不存在,则不产生效果。.add()和.delete()
    都会返回集合自身,所以我们可以用链式语法。
  •  set[Symbol.iterator]():返回一个新的遍历整个集合的迭代器。一般这个方法不会被直接调用,因为实际上就是它使集合能够被遍历,也就是说,我们可以直接写 for (v of set) {...}等等。
  • set.forEach(f):直接用代码来解释好了,它就像是 for (let value of set){ f(value, value, set); }的简写,类似于数组的.forEach()方法。
  •  set.clear():清空集合。
  •  set.keys()、 set.values()和 set.entries()返回各种迭代器,它们是为了兼容Map 而提供的,所以我们待会儿再来看。
     

负责构造集合的 new Set(iterable)是唯一一个在整个数据结构层面上操作的。把数组转化为集合,在一行代码内去重;也可以传递一个生成器,函数会逐个遍历它,并把生成的值收录为一个集合;也可以用来复制一个已有的集合。

Map(key-value)

map支持的操作:

  • new Map:返回一个新的、空的 Map。
  • new Map(pairs):根据所含元素形如[key, value]的数组 pairs 来创建一个新的Map。这里提供的 pairs 可以是一个已有的 Map 对象,可以是一个由二元数组组成的数组,也可以是逐个生成二元数组的一个生成器,等等。
  • map.size:返回 Map 中项目的个数。
  • map.has(key):测试一个键名是否存在,类似 key in obj。
  • map.get(key):返回一个键名对应的值,若键名不存在则返回 undefined,类似obj[key]。
  •  map.set(key, value):添加一对新的键值对,如果键名已存在就覆盖。
  • map.delete(key):按键名删除一项,类似 delete obj[key]。
  • map.clear():清空 Map。
  •  map[Symbol.iterator]():返回遍历所有项的迭代器,每项用一个键和值组成的二元数组表示。
  • map.forEach(f) 类似 for (let [key, value] of map) { f(value, key,map); } 。 这 里 诡 异 的 参 数 顺 序 , 和 Set 中 一 样 , 是 对 应 着Array.prototype.forEach()。
  • map.keys():返回遍历所有键的迭代器。
  • map.values():返回遍历所有值的迭代器。
  • map.entries():返回遍历所有项的迭代器,就像 map[Symbol.iterator]()。实际上,它们就是同一个方法,不同名字。

JS与其他函数的不同

一、没有哈希代码的哈希表

var urls = new Set;
urls.add(new URL(location.href)); // 两个 URL 对象。
urls.add(new URL(location.href)); // 它们一样么?
alert(urls.size); // 2

这两个 URL 应该按相同处理,毕竟它们有完全一样的属性。但在 JavaScript 中,它们是各自独立、互不相同的,并且,绝对没有办法来重载相等运算符。

二、可预测性

        遍历 Map或 Set 的顺序就是其中元素的插入顺序。自定义哈希表的遍历顺序会暴露一些哈希对象的代码,继而引发关于哈希函数实现的一些恼人的安全问题。例如,暴露出的代码绝不能获知一个对象的地址。(向不受信任的 ES 代码透露对象地址而对其自身隐藏,将是互联网的一大安全漏洞。)
 

WeakMap 和 WeakSet

 

  • WeakMap 只支持 new、 has、 get、 set 和 delete。

  • WeakSet 只支持 new、 has、 add 和 delete。

  • WeakSet 的值和 WeakMap 的键必须是对象。
     

三、隐藏垃圾回收的不确定性

一个 WeakSet 并不对其中对象保持强引用。当 WeakSet 中的一个对象被回收时,它会简单地被从 WeakSet 中移除。WeakMap 也类似地不为它的键保持强引用。如果一个键仍被使用,相应的值也就仍被使用。
弱引用暴露了底层垃圾回收的实现细节
 

 

 

 

 

本文参考《ES6-In-Depth》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值