# 描述

Set对象是值的集合,你可以按照插入的顺序迭代它的元素。  Set 中的元素只会出现一次,即 Set 中的元素是唯一的。
另外,NaN 和 undefined 都可以被存储在 Set 中,  
NaN 之间被视为相同的值(NaN 被认为是相同的,尽管 NaN !== NaN)。

# Set.prototype.size 属性

size 属性将会返回 Set 对象中(唯一的)元素的个数。
const mySet = new Set();
mySet.add(1);
mySet.add(5);
mySet.add("some text");

console.log(mySet.size); // 3

# Set.prototype.add() 方法

如果 Set 对象中没有具有相同值的元素,则 add() 方法将插入一个具有指定值的新元素到 Set 对象中。
const mySet = new Set();

mySet.add(1);
mySet.add(5).add('some text'); // 可以链式调用

console.log(mySet);
// Set [1, 5, "some text"]

# Set.prototype.clear() 方法

clear() 方法移除 Set 对象中所有元素。
const mySet = new Set();
mySet.add(1);
mySet.add("foo");

console.log(mySet.size);       // 2
console.log(mySet.has("foo")); // true

mySet.clear();

console.log(mySet.size);       // 0
console.log(mySet.has("foo")); // false

# Set.prototype.delete() 方法

delete() 方法从 Set 对象中删除指定的值(如果该值在 Set 中)。
const mySet = new Set();
mySet.add("foo");

console.log(mySet.delete("bar")); // 返回 false,不包含 "bar" 这个元素
console.log(mySet.delete("foo")); // 返回 true,删除成功

console.log(mySet.has("foo"));    // 返回 false,"foo" 已经成功删除

//对象的删除
const setObj = new Set(); // 创建一个新 set

setObj.add({ x: 10, y: 20 }); // 在 set 中添加对象

setObj.add({ x: 20, y: 30 }); // 在 set 中添加对象

// 删除任何 'x > 10' 的点
setObj.forEach((point) => {
  if (point.x > 10) {
    setObj.delete(point);
  }
});

# Set.prototype.entries() 方法

entries() 方法返回一个新的迭代器对象,这个对象包含的元素是类似 [value, value] 形式的数组,value 是集合对象中的每个元素,迭代器对象元素的顺序即集合对象中元素插入的顺序。由于集合对象不像 Map 对象那样拥有 key,然而,为了与 Map 对象的 API 形式保持一致,故使得每一个条目的 key 和 value 都拥有相同的值,因而最终返回一个 [value, value] 形式的数组。
const mySet = new Set();
mySet.add('foobar');
mySet.add(1);
mySet.add('baz');

const setIter = mySet.entries();

console.log(setIter.next().value); // ["foobar", "foobar"]
console.log(setIter.next().value); // [1, 1]
console.log(setIter.next().value); // ["baz", "baz"]

# Set.prototype.forEach() 方法

forEach() 方法对 Set 对象中的每个值按插入顺序执行一次提供的函数。

function logSetElements(value1, value2, set) {
  console.log(`s[${value1}] = ${value2}`);
}

new Set(['foo', 'bar', undefined]).forEach(logSetElements);

// expected output: "s[foo] = foo"
// expected output: "s[bar] = bar"
// expected output: "s[undefined] = undefined"

# Set.prototype.has() 方法

has() 方法返回一个布尔值来指示对应的值是否存在于 Set 对象中。
const mySet = new Set();
mySet.add("foo");

console.log(mySet.has("foo"));  // true
console.log(mySet.has("bar"));  // false

const set1 = new Set();
const obj1 = { key1: 1 };
set1.add(obj1);

console.log(set1.has(obj1));        // true
console.log(set1.has({ key1: 1 })); // false, 因为它们是不同的对象引用
console.log(set1.add({ key1: 1 })); // 现在 set1 包含 2 个条目

# Set.prototype.keys() 方法

TIP

备注: keys() 方法是该方法的别名(与 Map 对象相似)。因此这里重定向 keys() 页。
它的行为完全相同,并返回 Set 元素的值。

# Set.prototype.values() 方法

values() 方法返回一个新的迭代器对象,该对象按插入顺序包含 Set 对象中每个元素的值。
const mySet = new Set();
mySet.add('foo');
mySet.add('bar');
mySet.add('baz');

const setIter = mySet.values();

console.log(setIter.next().value); // "foo"
console.log(setIter.next().value); // "bar"
console.log(setIter.next().value); // "baz"