let set = newSet(); set.add(1); console.log(set.values()); /* @Iterator */ console.log(set.has(1)); /* true */ console.log(set.size); /* 1 */
和之前写的 Set 不同, ES6的 Set 的 values 方法返回 Iterator ,而不是值构成的数组。另一个区别是,我们的 size 方法返回 set 中存储的值的个数,而ES6的 Set 则有一个 size 属性。
ES6 Set 类的操作
1 2 3 4 5 6 7 8 9
let setA = newSet(); setA.add(1); setA.add(2); setA.add(3);
let setB = newSet(); setB.add(2); setB.add(3); setB.add(4);
1. 模拟并集操作
1 2 3
let unionAB = newSet(); for (let x of setA) unionAB.add(x); for (let x of setB) unionAB.add(x);
2.模拟交集操作
1 2 3 4 5 6 7 8 9 10
let intersection = function(setA, setB) { let intersectionSet = newSet(); for (let x of setA) { if (setB.has(x)) { intersectionSet.add(x); } } return intersectionSet; }; let intersectionAB = intersection(setA, setB);
也可以使用更简单的语法实现
1
intersectionAB = newSet([x for (x of setA) if (setB.has(x))]);
3.模拟差集操作
1 2 3 4 5 6 7 8 9 10
let difference = function(setA, setB) { let differenceSet = newSet(); for (let x of setA) { if (!setB.has(x)) { differenceSet.add(x); } } return differenceSet; }; let differenceAB = difference(setA, setB);
依然可以使用更简单的语法实现
1
differenceAB = newSet([x for (x of setA) if (!setB.has(x))]);
原书备注“目前只有Firefox支持简化语法,但在所有支持ES6的现代浏览器中都以执行普通函数”
但是我在以下浏览器全部运行失败
Google Chrome Version 74.0.3729.169 (Official Build) (64-bit)
Google Chrome Version 76.0.3809.2 (Official Build) canary (64-bit)