如前所述先前,我们有一个新的JavaScript标准,通常称为ECMAScript 6 (ES6)。我最近花了相当多的时间阅读标准中概述的新功能,这些功能即将出现或最近在我们的浏览器中实现。我最喜欢的补充之一是新的设置类型。一个集合有点像一个数组。这是一个存储值的地方: 数字,字符串,对象,实际数组,布尔值,其他集合等。最显著的区别是它只存储相同的元素一次。
创建和添加元素到集合中
,它真的很容易设置一个新的,空的,设置:
var A = new Set(); // A是一个没有任何东西的集合
,然后我们可以添加元素到集使用chainable 添加方法:
A.add(1).add(2).add(“1”).add([1,2,3,4,5]).add({}); // 集合现在包含5个元素的各种类型
请注意,1和 “1” 是不同的-没有类型强制转换,因此两者都可以添加到集合中。另一方面,如果我们尝试再次添加数字1,则不会发生任何变化:
A.add(1); // 集合仍然包含5个元素
但是,我们可以添加另一个空对象到
数组。
A.add({}); // 集合包含6个元素,其中2个是空对象
为什么这个工作?因为只有两个对象是相等的如果它们在内存中引用相同的空间。这两个对象可能包含相同的属性和方法,但在这里它们不被认为是相等的。同样适用于数组:
A.add([1,2,3,4,5]); // 集合包含7个元素,包括两个数组
,相反,下面只添加一个数组,而不是两个或三个,因为的x和的y引用同一个对象在内存中。
var x = [‘a’,’b’,’c’]; var y = x; // y是x的别名A.add(x).add(y); // 只有第一次调用add将任何内容添加到集合中
您还可以通过传入任何元素来将元素添加到集合中可迭代作为原始构造调用的参数。最简单的选项是一个数组:
var B = 新集合 ([7,8,9]); // B是一个包含3个元素的集合
令人困惑的是,字符串是可迭代的 (但数字不是)。所以这导致了一个TypeError…
B = 新集合 (123); // 不,不能这样做
。.. 但是下面创建了一个包含三个元素的集合!
B = new Set(‘123’); // B是一个集,包含三个元素,字符串 ‘1’,’2′ 和 ‘3’
: 要添加一个字符串到一个新的集合,把它放在一个数组:
B = 新集合 ([‘123’]); // B是一个集合,包含单个元素 (字符串) ‘123’
,没有什么可以阻止你使用add方法:
B.add(new Set([1,2,3])) // B现在包含2个元素,字符串 ‘123’ 和数字1、2和3的集合B.add(new set ([7,8,9])) // B现在包含3个元素,包括2个集合
,在另一方面,以下只是创建一个集包含前三个正整数:
var C = 新集合 ([1,2,3] ))// 同var C = 新集合 ([1,2,3])
,您还可以克隆 (而不是别名) 另一组使用新集:
var D = 新集合 (A); // A和D是完全不同的集合,它们只是 (当前) 具有相同的成员
检查Set成员资格
,检查集合成员资格也很容易使用 有方法。
A.has(1); // true A.has(2); // true A.has(‘1 ‘); // true A.has(75); // false
当然你不能只需检查一个空对象或数组 [1,2,3,4,5],因为同样的原因,你可以添加多个这样的对象或数组。
A.has({}); // false A.has([1, 2, 3, 4, 5]); // false
,你可以,但是,检查特定的对象或数组 (或日期或其他非原语),你有引用。
A.has(x); // true A.has(y); // true: y是x的别名 (见上文)
删除元素从一个集
delete的 方法将成员从集中删除。
A.Delete (1); // 删除1从集合中,返回true A.has(1); // false a.Delete (x); // true A.has(y); // false: y是数组x的别名,它不再是
如前所述,添加方法是可链接的,因为它返回这个。相比之下,如果您使用流行音乐或轮班在常规数组上,它们返回提取的元素。的删除的方法设置这些都不是,它只是返回一个布尔值来指示一个元素是否被删除。因此,你不能链删除电话。当然,你不能删除一个对象或数组你没有一个参考:
A.de lete({}); // false A.de lete([1, 2, 3, 4, 5]); // false你可以使用清除方法 (它返回未定义无论是否清除任何内容):B.clear(); // B现在是一个空集。
检查集合的大小
像数组一样,您可以检查集合包含的元素数量。与数组不同,相关属性称为尺寸,不长度。
A.size; // 6: 数字2,字符串 ‘1’,2个数组包含数字1到5和2个空对象B.size; // 0
循环遍历一组
set不允许任何形式的随机访问。例如,您不能像使用数组一样使用方括号符号访问集合的第一个或任何其他元素。(话虽如此,如果你尝试的结果是不确定的,而不是一个错误。)这也意味着你不能使用老式的用于循环。for-in循环也不起作用。然而,有几个选项来获取元素。您可以使用新的JavaScriptfor-of循环,用于循环任何可迭代对象,包括集合。下面简单地将所有元素按照添加到集合中的顺序记录到控制台:
for(var元素in A) { console.log(element); // 打印出6个元素}
和数组一样,集合有一个forEach方法。这与上面的示例相同:
A.forEach(function(el){console.log(el);}); // 与for-of循环一样
用途和限制
我喜欢JavaScript集,因为它们看起来相对容易使用。当您不想担心重复数据及其可能导致的问题时,它们提供了一个简单的系统来保存和访问数据集合。不出所料,它们也有点像数学概念一套。正因为如此,ES6规范不包括执行常见数学集合运算的方法,这可能有点令人惊讶,例如活接头,交叉路口和对称差。至少暂时,你必须为自己实现这些 (可以找到一些指针这里)。此外,没有直接的方式来表示,比方说,所有自然数的集合或JavaScript集合中的所有实数的集合 (因为它们都是无限集合),就像你在数学中可能希望的那样。
浏览器支持
进一步阅读
我找到了网上的书探索ES6Axel Rauschmayer博士对es6的所有事情都有很好的参考。第19章盖子集和相关的 “集合”弱组,地图和弱映射。这篇博客文章Jason Orendorff为Mozilla提供的收藏也值得一读
尝试我们的jQuery HTML5控件为您的web应用程序,并立即利用其惊人的数据可视化功能。下载免费试用版今天。
</p