《每天十分钟》-红宝书第4版-集合引用类型(四)- Set

Set 在很多方面都像是加强的 Map,这是因为它们的大多数 API 和行为都是共有的。

基本 API

使用 new 关键字和 Set 构造函数可以创建一个空集合

const m = new Set();
// 使用数组初始化集合 
const s1 = new Set(["val1", "val2", "val3"]); 
alert(s1.size); // 3 
// 使用自定义迭代器初始化集合
const s2 = new Set({ 
 [Symbol.iterator]: function*() { 
 yield "val1"; 
 yield "val2"; 
 yield "val3"; 
 } 
}); 
alert(s2.size); // 3

使用 add()增加值,使用 has()查询,通过 size 取得元素数量,以及使用 delete()和 clear()删除元素。
与 Map 类似,Set 可以包含任何 JavaScript 数据类型作为值。

顺序与迭代

可以通过 values()方法及其别名方法 keys()(或者 Symbol.iterator 属性,它引用 values())取得这个迭代器

const s = new Set(["val1", "val2", "val3"]); 
alert(s.values === s[Symbol.iterator]); // true 
alert(s.keys === s[Symbol.iterator]); // true 
for (let value of s.values()) { 
 alert(value); 
} 
// val1 
// val2 
// val3 
for (let value of s[Symbol.iterator]()) { 
 alert(value); 
} 
// val1 
// val2 
// val3

集合的 entries()方法返回一个迭代器,可以按照插入顺序产生包含两个元素的数组,这两个元素是集合中每个值的重复出现:

const s = new Set(["val1", "val2", "val3"]); 
for (let pair of s.entries()) { 
 console.log(pair); 
} 
// ["val1", "val1"] 
// ["val2", "val2"] 
// ["val3", "val3"]

定义正式集合操作

使用Set时,需要考虑几个地方。
某些 Set 操作是有关联性的,因此最好让实现的方法能支持处理任意多个集合实例。
Set 保留插入顺序,所有方法返回的集合必须保证顺序。
尽可能高效地使用内存。扩展操作符的语法很简洁,但尽可能避免集合和数组间的相互转换能够节省对象初始化成本。
不要修改已有的集合实例。union(a, b)或 a.union(b)应该返回包含结果的新集合实例。

WeakSet

WeakSet 是 Set 的“兄弟”类型,其 API 也是 Set 的子集。WeakSet 中的“weak”(弱),描述的是 JavaScript 垃圾回收程序对待“弱集合”中值的方式。
相比于 WeakMap 实例,WeakSet 实例的用处没有那么大。

小结

JavaScript 中的对象是引用值,可以通过几种内置引用类型创建特定类型的对象。
1. 引用类型与传统面向对象编程语言中的类相似,但实现不同。
2. Object 类型是一个基础类型,所有引用类型都从它继承了基本的行为。
3. Array 类型表示一组有序的值,并提供了操作和转换值的能力。
4. 定型数组包含一套不同的引用类型,用于管理数值在内存中的类型。
5. Date 类型提供了关于日期和时间的信息,包括当前日期和时间以及计算。
6. RegExp 类型是 ECMAScript 支持的正则表达式的接口,提供了大多数基本正则表达式以及一些高级正则表达式的能力。
JavaScript 比较独特的一点是,函数其实是 Function 类型的实例,这意味着函数也是对象。由于函数是对象,因此也就具有能够增强自身行为的方法。
因为原始值包装类型的存在,所以 JavaScript 中的原始值可以拥有类似对象的行为。有 3 种原始值包装类型:Boolean、Number 和 String。它们都具有如下特点。
1. 每种包装类型都映射到同名的原始类型。
2. 在以读模式访问原始值时,后台会实例化一个原始值包装对象,通过这个对象可以操作数据。
3. 涉及原始值的语句只要一执行完毕,包装对象就会立即销毁。
JavaScript 还有两个在一开始执行代码时就存在的内置对象:Global 和 Math。其中,Global 对象在大多数 ECMAScript 实现中无法直接访问。不过浏览器将 Global 实现为 window 对象。所有全局变量和函数都是 Global 对象的属性。Math 对象包含辅助完成复杂数学计算的属性和方法。ECMAScript 6 新增了一批引用类型:Map、WeakMap、Set 和 WeakSet。这些类型为组织应用程序数据和简化内存管理提供了新能力。

我本渔樵孟诸野,一生自是悠悠者。-------- 唐 高适

你可能感兴趣的:(《每天十分钟》红宝书第4版,javascript)