recursal/MDN huggingface dataset:
ArrayBuffer() 构造函数
==================

**`ArrayBuffer()`** 构造函数创建 `ArrayBuffer` 对象。

尝试一下
----

语法
--


```js
new ArrayBuffer(length)
new ArrayBuffer(length, options)
```


**备注：** `ArrayBuffer()` 只能使用 `new` 构造。尝试在没有 `new` 的情况下调用会抛出 `TypeError`。

### 参数

`length`

要创建的数组缓冲区的大小（以字节为单位）。

`options` 可选

一个对象，可以包含以下属性：

`maxByteLength` 可选

数组缓冲区可以调整到的最大大小，以字节为单位。


### 返回值

一个指定大小的新 `ArrayBuffer` 对象，其 `maxByteLength` 属性设置为指定的 `maxByteLength`（如果指定了该值），其内容被初始化为 0。

### 异常

`RangeError`

有下列情况之一时抛出：

* `length` 或 `maxByteLength` 大于 `Number.MAX_SAFE_INTEGER`（≥ 253）或者为负数。
* `length` 大于 `maxByteLength`。

示例
--

### 创建一个 ArrayBuffer

在这个示例中，我们创建一个 8 字节的缓冲区，并使用一个 `Int32Array` 视图来引用该缓冲区：


```js
const buffer = new ArrayBuffer(8);
const view = new Int32Array(buffer);
```

### 创建一个可以调整大小的 ArrayBuffer

在这个示例中，我们创建一个 8 字节的缓冲区，它可以调整到的最大长度为 16 字节，然后使用 `resize()` 调整到 12 字节：


```js
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });

buffer.resize(12);
```


**备注：** 推荐将 `maxByteLength` 设置为使用场景下最小的大小。它不应超过 `1073741824`（1GB），以减少内存溢出风险。

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-arraybuffer-constructor |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `core-js` 中 `ArrayBuffer` 的 polyfill
* JavaScript 类型化数组指南
* `SharedArrayBuffer`
ArrayBuffer.prototype.resizable
===============================

`ArrayBuffer` 实例的 **`resizable`** 访问器属性返回此数组缓冲区是否可以调整大小。

尝试一下
----

描述
--

`resizable` 是一个访问器属性，其 set 访问器函数是 `undefined`，这意味着你只能读取该属性。该属性的值在数组创建时就确定了。如果在构造函数中设置了 `maxByteLength` 选项，`resizable` 将返回 `true`；否则，它将返回 `false`。

示例
--

### 使用 resizable

在这个示例中，我们创建了一个 8 字节缓冲区，该缓冲区可调整到的最大长度为 16 字节，然后检查它的 `resizable` 属性，如果 `resizable` 返回 `true` 则调整它的大小：


```js
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });

if (buffer.resizable) {
  console.log("缓冲区可以调整大小！");
  buffer.resize(12);
}
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-get-arraybuffer.prototype.resizable |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `ArrayBuffer`
* `ArrayBuffer.prototype.maxByteLength`
* `ArrayBuffer.prototype.resize()`
ArrayBuffer.prototype.detached
==============================

**实验性:** **这是一项实验性技术**  
在将其用于生产之前，请仔细检查浏览器兼容性表格。

`ArrayBuffer` 实例的 **`detached`** 访问器属性返回一个布尔值，指示该缓冲区是否已经分离（传输）。

描述
--

`detached` 属性是一个访问器属性，其 set 访问器函数是 `undefined`，这意味着你只能读取此属性。该属性的值在创建 `ArrayBuffer` 时设置为 `false`。如果 `ArrayBuffer` 已被传输，则该值将变为 `true`，这将使该实例从其底层内存中分离。一旦缓冲区被分离，它就不再可用。

示例
--

### 使用 detached


```js
const buffer = new ArrayBuffer(8);
console.log(buffer.detached); // false
const newBuffer = buffer.transfer();
console.log(buffer.detached); // true
console.log(newBuffer.detached); // false
```

规范
--

| Specification |
| --- |
| ArrayBuffer transfer # sec-get-arraybuffer.prototype.detached |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `ArrayBuffer`
* `ArrayBuffer.prototype.transfer()`
* `ArrayBuffer.prototype.transferToFixedLength()`
ArrayBuffer.isView()
====================

**`ArrayBuffer.isView()`** 静态方法判断传入值是否是 `ArrayBuffer` 视图之一，例如类型化数组对象或 `DataView`。

尝试一下
----

语法
--


```js
ArrayBuffer.isView(value)
```

### 参数

`value`

要检查的值。

### 返回值

如果给定参数是 `ArrayBuffer` 视图之一则返回 `true`；否则返回 `false`。

示例
--

### 使用 isView


```js
ArrayBuffer.isView(); // false
ArrayBuffer.isView([]); // false
ArrayBuffer.isView({}); // false
ArrayBuffer.isView(null); // false
ArrayBuffer.isView(undefined); // false
ArrayBuffer.isView(new ArrayBuffer(10)); // false

ArrayBuffer.isView(new Uint8Array()); // true
ArrayBuffer.isView(new Float32Array()); // true
ArrayBuffer.isView(new Int8Array(10).subarray(0, 3)); // true

const buffer = new ArrayBuffer(2);
const dv = new DataView(buffer);
ArrayBuffer.isView(dv); // true
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-arraybuffer.isview |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* JavaScript 类型化数组指南
ArrayBuffer.prototype.maxByteLength
===================================

`ArrayBuffer` 实例的 **`maxByteLength`** 访问器属性返回该数组缓冲区可调整到的最大长度（以字节为单位）。

尝试一下
----

描述
--

`maxByteLength` 属性是一个访问器属性，其设置访问器函数为 `undefined`，这意味着你只能读取此属性。该值在构造数组时通过 `ArrayBuffer()` 构造函数的 `maxByteLength` 选项设置，并且不能更改。

如果该 `ArrayBuffer` 已分离，则该属性返回 0。如果该 `ArrayBuffer` 构造时未指定 `maxByteLength` 值，则该属性返回 `ArrayBuffer` 的 `byteLength` 值。

示例
--

### 使用 maxByteLength

在该示例中，我们创建一个 8 字节缓冲区，该缓冲区可调整到的最大长度为 16 字节，然后返回其 `maxByteLength`：


```js
const buffer = new ArrayBuffer(8, { maxByteLength: 16 });

buffer.maxByteLength; // 16
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-get-arraybuffer.prototype.maxbytelength |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `ArrayBuffer`
* `ArrayBuffer.prototype.byteLength`
* `ArrayBuffer.prototype.resize()`
ArrayBuffer.prototype.byteLength
================================

`ArrayBuffer` 实例的 `byteLength` 访问器属性返回该数组缓冲区的长度（以字节为单位）。

尝试一下
----

描述
--

`byteLength` 属性是一个访问器属性，它的 set 访问器函数是 `undefined`，这意味着你只能读取这个属性。该值在数组创建时确定，并且无法修改。如果这个 `ArrayBuffer` 被分离，则此属性返回 0。

示例
--

### 使用 byteLength


```js
const buffer = new ArrayBuffer(8);
buffer.byteLength; // 8
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-get-arraybuffer.prototype.bytelength |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `ArrayBuffer`
ArrayBuffer[@@species]
======================

**`ArrayBuffer[@@species]`** 静态访问器属性返回用于构造数组缓冲区方法返回值的构造函数。

**警告：** `@@species` 的存在允许任意代码执行，并可能产生安全漏洞。这也使某些优化变得更加困难。引擎实现者正在调查是否删除此特性。如果可能的话，请避免依赖它。

语法
--


```js
ArrayBuffer[Symbol.species]
```

### 返回值

调用 `get @@species` 的构造函数（`this`）的值。该返回值被用于构造创建新的数组缓冲区的数组缓冲区方法的返回值。

描述
--

`@@species` 访问器属性返回 `ArrayBuffer` 对象的默认构造函数。子类构造函数可以重写它来更改构造函数赋值。基本的默认实现是：


```js
// 用于说明的假设基础实现
class ArrayBuffer {
  static get [Symbol.species]() {
    return this;
  }
}
```


由于这种多态实现，派生子类的 `@species` 也将默认返回构造函数本身。


```js
class SubArrayBuffer extends ArrayBuffer {}
SubArrayBuffer[Symbol.species] === SubArrayBuffer; // true
```


当调用不会修改现有对象，而是返回一个新的数组缓冲区实例数组缓冲区方法（例如，`slice()`）时，对象的 `constructor[@@species]` 将被访问。返回的构造函数将用于构造该数组缓冲区方法的返回值。

示例
--

### 普通对象中的 species

`@@species` 属性返回默认构造函数，即 `ArrayBuffer` 构造函数。


```js
ArrayBuffer[Symbol.species]; // function ArrayBuffer()
```

### 派生对象中的 species

在一个自定义的 `ArrayBuffer` 子类实例中，例如 `MyArrayBuffer`，`MyArrayBuffer` 的 `species` 是 `MyArrayBuffer` 构造函数。但是，你可能希望重写它，以便在派生类方法中返回父类 `ArrayBuffer` 对象：


```js
class MyArrayBuffer extends ArrayBuffer {
  // 重写 MyArrayBuffer species 来返回父类 ArrayBuffer 构造函数
  static get [Symbol.species]() {
    return ArrayBuffer;
  }
}
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-get-arraybuffer-@@species |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `ArrayBuffer`
* `Symbol.species`
WeakSet() 构造函数
==============

**`WeakSet()`** 构造函数创建 `WeakSet` 对象。

语法
--


```js
new WeakSet()
new WeakSet(iterable)
```


**备注：** `WeakSet()` 构造函数只能使用 `new` 调用。不使用 `new` 而直接调用会抛出 `TypeError`。

### 参数

`iterable` 可选

如果传入了一个可迭代对象，这个对象的所有元素都会被添加到新的 `WeakSet` 对象中。`null` 会被视为 `undefined`。

示例
--

### 使用 WeakSet 对象


```js
const ws = new WeakSet();
const foo = {};
const bar = {};

ws.add(foo);
ws.add(bar);

ws.has(foo); // true
ws.has(bar); // true

ws.delete(foo); // 将 foo 从集合中移除
ws.has(foo); // false，foo 已经被移除
ws.has(bar); // true，bar 被保留
```


请注意 `foo !== bar`。它们是相似的对象，*但它们**不是同一个对象***。因此，它们都会被添加到集合中。

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-weakset-constructor |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `core-js` 中 `WeakSet` 的 polyfill
* `WeakSet`
WeakSet.prototype.delete()
==========================

`WeakSet` 实例的 **`delete()`** 方法从该 `WeakSet` 对象中删除指定的元素。

尝试一下
----

语法
--


```js
weakSetInstance.delete(value)
```

### 参数

`value`

要从 `WeakSet` 对象中删除的值。

### 返回值

如果成功在 `WeakSet` 对象中删除了元素，则返回 `true`。如果未在 `WeakSet` 中找到该 `value`，则返回 `false`。如果 `value` 不是对象或非全局注册的符号，则始终返回 `false`。

示例
--

### 使用 delete() 方法


```js
const ws = new WeakSet();
const obj = {};

ws.add(window);

ws.delete(obj); // 返回 false。没有找到要删除的对象。
ws.delete(window); // 返回 true。成功删除。

ws.has(window); // 返回 false。WeakMap 中已经不存在 window 对象。
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-weakset.prototype.delete |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `WeakSet`
* `WeakSet.prototype.add()`
* `WeakSet.prototype.has()`
WeakSet.prototype.add()
=======================

`WeakSet` 实例的 **`add()`** 方法在该 `WeakSet` 对象的末尾追加一个新的对象。

尝试一下
----

语法
--


```js
add(value)
```

### 参数

`value`

必须是对象或非全局注册的符号。将要添加到 `WeakSet` 集合中的值。

### 返回值

该 `WeakSet` 对象。

### 异常

`TypeError`

如果 `value` 不是一个对象或非全局注册的符号，则抛出该异常。

示例
--

### 使用 add


```js
const ws = new WeakSet();

ws.add(window); // 将 window 对象添加到 WeakSet

ws.has(window); // true

// WeakSet 只接受对象作为参数
ws.add(1);
// Chrome 中的结果：“TypeError: Invalid value used in weak set”
// Firefox 中的结果：“TypeError: 1 is not a non-null object”
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-weakset.prototype.add |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `WeakSet`
* `WeakSet.prototype.delete()`
* `WeakSet.prototype.has()`
WeakSet.prototype.has()
=======================

`WeakSet` 实例的 **`has()`** 方法返回一个布尔值，指示该 `WeakSet` 中指定的对象是否存在。

尝试一下
----

语法
--


```js
has(value)
```

### 参数

`value`

要测试是否在该 `WeakSet` 对象中存在的值。

### 返回值

如果指定的值存在于 `WeakSet` 对象中，则返回 `true`；否则返回 `false`。如果 `value` 不是对象或非全局注册的符号，则始终返回 `false`。

示例
--

### 使用 `has()` 方法


```js
const ws = new WeakSet();
const obj = {};
ws.add(window);

ws.has(window); // 返回 true
ws.has(obj); // 返回 false

// 存储非全局注册的符号
const sym = Symbol("foo");
ws.add(sym);
ws.add(Symbol.iterator);
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-weakset.prototype.has |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `WeakSet`
* `WeakSet.prototype.add()`
* `WeakSet.prototype.delete()`
Set.prototype.delete()
======================

`Set` 实例的 **`delete()`** 方法从该集合中删除指定值，如果该值在集合中。

尝试一下
----

语法
--


```js
setInstance.delete(value)
```

### 参数

`value`

要从 `Set` 中移除的值。

### 返回值

成功删除返回 `true`，否则返回 `false`。

示例
--

### 使用 delete() 方法


```js
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" 已经成功删除
```

### 从 Set 中删除对象

因为对象是通过引用比较的，所以如果没有对原始对象的引用，就必须通过检查各个属性来删除它们。


```js
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);
  }
});
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-set.prototype.delete |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Set`
* `Set.prototype.clear()`
Set.prototype.keys()
====================

`Set` 实例的 **`keys()`** 方法是 `values()` 方法的别名。

语法
--


```js
keys()
```

### 参数

无。

### 返回值

一个新的可迭代迭代器对象。

示例
--

### 使用 keys()

`keys()` 方法完全等价于 `values()` 方法。


```js
const mySet = new Set();
mySet.add("foo");
mySet.add("bar");
mySet.add("baz");

const setIter = mySet.keys();

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

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-set.prototype.keys |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Set.prototype.entries()`
* `Set.prototype.values()`
Set.prototype.size
==================

`Set` 实例的 **`size`** 访问器属性将返回该集合中（唯一的）元素的个数。

尝试一下
----

描述
--

`size` 的值是一个整数，表示 `Set` 对象有多少条目。`size` 的 set 访问函数是 `undefined`；你无法改变这个属性。

示例
--

### 使用 size


```js
const mySet = new Set();
mySet.add(1);
mySet.add(5);
mySet.add("some text");

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

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-get-set.prototype.size |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Set`
Set.prototype.forEach()
=======================

`Set` 实例的 **`forEach()`** 方法按插入顺序为该集合中的每个值执行一次提供的函数。

尝试一下
----

语法
--


```js
forEach(callbackFn)
forEach(callbackFn, thisArg)
```

### 参数

`callback`

为集合中每个元素执行的函数，使用以下参数调用该函数：

`value`

每次迭代的值。

`key`

每次迭代的键。始终与 `value` 相同。

`set`

正在迭代的集合。


`thisArg` 可选

执行 `callbackFn` 时用作 `this` 的值。

### 返回值

无（`undefined`）。

描述
--

`forEach()` 方法对 `Set` 对象中实际存在的每个值执行一次提供的 `callback`。对于已删除的值，不会调用它。但是，它会对存在但值为 `undefined` 的值执行。

`callback` 被调用时带有**三个参数**：

* **元素的值**
* **元素的键**
* **被遍历的 `Set`**

`Set` 对象中没有键，所以前两个参数都是 `Set` 中包含的**值**。这是为了与 `Map` 和 `Array` 的 `forEach()` 方法保持一致。

如果提供了一个 `thisArg` 参数给 `forEach` 函数，则参数将会作为回调函数中的 `this`值。否则 `this` 值为 `undefined`。回调函数中 `this` 的绑定是根据函数被调用时通用的 `this` 绑定规则来决定的。

每个值都访问一次，除非在 `forEach()` 完成之前删除并重新添加它。在访问之前删除的值不会调用 `callback`。在 `forEach()` 完成之前添加的新值将被访问。

`forEach()` 对 `Set` 对象中的每个元素执行一次 `callback` 函数；它没有返回值。

示例
--

### 输出集合对象的内容

以下代码依次打印 `Set` 对象的元素：


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

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

// logs:
// "s[foo] = foo"
// "s[bar] = bar"
// "s[undefined] = undefined"
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-set.prototype.foreach |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Array.prototype.forEach()`
* `Map.prototype.forEach()`
Set() 构造函数
==========

**`Set()`** 构造函数创建 `Set` 对象。

尝试一下
----

语法
--


```js
new Set()
new Set(iterable)
```


**备注：** `Set()` 只能用 `new` 构建。试图在没有 `new` 的情况下调用它，会抛出 `TypeError`。

### 参数

`iterable` 可选

如果传入一个可迭代对象，它的所有元素将不重复地被添加到新的 `Set` 中。如果不指定此参数或其值为 `null`，则新的 `Set` 为空。

### 返回值

一个新的 `Set` 对象。

示例
--

### 使用 `Set` 对象


```js
const mySet = new Set();

mySet.add(1); // Set [ 1 ]
mySet.add(5); // Set [ 1, 5 ]
mySet.add(5); // Set [ 1, 5 ]
mySet.add("some text"); // Set [ 1, 5, 'some text' ]
const o = { a: 1, b: 2 };
mySet.add(o);
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-set-constructor |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `core-js` 中 `Set` 的 polyfill
* `Set`
Set.prototype[@@iterator]()
===========================

`Set` 实例的 **`[@@iterator]()`** 方法实现了可迭代协议以允许 `Set` 对象被大多数期望可迭代对象的语法所使用，例如展开语法和 `for...of` 循环。它返回一个集合迭代器对象，它会以插入顺序生成集合的值。

该属性的初始值与 `Set.prototype.values()` 属性的初始值是同一个函数对象。

尝试一下
----

语法
--


```js
set[Symbol.iterator]()
```

### 参数

无。

### 返回值

与 `Set.prototype.values()` 返回值相同：一个新的可迭代迭代器对象，它会以插入顺序生成集合的值。

示例
--

### 使用 for...of 循环进行迭代

请注意，通常你不需要直接调用此方法。`@@iterator` 方法的存在使得 `Set` 对象可迭代，而像 `for...of` 循环这样的迭代语法会自动调用此方法以获取用于循环的迭代器。


```js
const mySet = new Set();
mySet.add("0");
mySet.add(1);
mySet.add({});

for (const v of mySet) {
  console.log(v);
}
```

### 手动控制迭代器

你仍然可以手动调用返回的迭代器对象的 `next()` 方法来获得最大程度的控制权。


```js
const mySet = new Set();
mySet.add("0");
mySet.add(1);
mySet.add({});

const setIter = mySet[Symbol.iterator]();

console.log(setIter.next().value); // "0"
console.log(setIter.next().value); // 1
console.log(setIter.next().value); // {}
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-set.prototype-@@iterator |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Set`
* `Set.prototype.entries()`
* `Set.prototype.keys()`
* `Set.prototype.values()`
* `Symbol.iterator`
* 迭代协议
Set.prototype.entries()
=======================

`Set` 实例的 **`entries()`** 方法返回一个新的*集合迭代器*对象，该对象包含了此集合中每个元素的 **`[value, value]` 数组**，按插入顺序排列。`Set` 对象没有类似于 `Map` 对象中的 `key`。因此，为了保持 API 与 `Map` 对象类似，这里每个 *entry* 的 *key* 和 *value* 都相同，所以返回的数组为 `[value, value]`。

尝试一下
----

语法
--


```js
entries()
```

### 参数

无。

### 返回值

一个新的可迭代迭代器对象。

示例
--

### 使用 entries()


```js
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"]
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-set.prototype.entries |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Set.prototype.keys()`
* `Set.prototype.values()`
get Set[@@species]
==================

**`Set[@@species]`** 静态访问器属性是一个未使用的访问器属性，指定了如何复制 `Set` 对象。

语法
--


```js
Set[Symbol.species]
```

### 返回值

调用 `get @@species` 的构造函数的值（`this`）。返回值用于构造复制的 `Set` 实例。

描述
--

`@@species` 访问器属性返回 `Set` 对象的默认构造函数。子类构造函数可以覆盖它以更改构造函数赋值。

**备注：** 目前所有 `Set` 方法均未使用此属性。

示例
--

### 普通对象的 Species

`@@species` 属性返回默认构造函数，即 `Set` 的构造函数。


```js
Set[Symbol.species]; // 函数 Set()
```

### 派生对象的 Species

在一个自定义的 `Set` 子类（如 `MySet`）的实例中，`MySet` 的 `species` 是 `MySet` 构造函数。但是，你可能希望覆盖它，以便在派生类方法中返回父 `Set` 对象：


```js
class MySet extends Set {
  // 用父类 Set 构造函数覆盖 MySet 的 species
  static get [Symbol.species]() {
    return Set;
  }
}
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-get-set-@@species |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Set`
* `Symbol.species`
Set.prototype.has()
===================

`Set` 实例的 **`has()`** 方法返回一个布尔值来指示对应的值是否存在于该集合中。

尝试一下
----

语法
--


```js
has(value)
```

### 参数

`value`

要测试是否存在于 `Set` 对象中的值。

### 返回值

如果 `Set` 对象中存在具有指定值的元素，则返回 `true`；否则返回 `false`。

示例
--

### 使用 has() 方法


```js
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 个条目
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-set.prototype.has |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Set`
* `Set.prototype.add()`
* `Set.prototype.delete()`
Set.prototype.add()
===================

`Set` 实例的 **`add()`** 方法会在该集合中插入一个具有指定值的新元素，如果该 `Set` 对象中没有具有相同值的元素。

尝试一下
----

语法
--


```js
add(value)
```

### 参数

`value`

要添加到 `Set` 对象的元素的值。

### 返回值

添加了值的 `Set` 对象。

示例
--

### 使用 add() 方法


```js
const mySet = new Set();

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

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

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-set.prototype.add |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Set`
* `Set.prototype.delete()`
* `Set.prototype.has()`
Set.prototype.values()
======================

`Set` 实例的 **`values()`** 方法返回一个新的*集合迭代器*对象，该对象包含此集合对象中每个元素的值，按插入顺序排列。

尝试一下
----

语法
--


```js
values()
```

### 参数

无。

### 返回值

一个新的可迭代迭代器对象。

示例
--

### 使用 values()


```js
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"
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-set.prototype.values |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Set.prototype.entries()`
* `Set.prototype.keys()`
Set.prototype.clear()
=====================

`Set` 实例的 **`clear()`** 方法移除该集合中的所有元素。

尝试一下
----

语法
--


```js
clear()
```

### 参数

无。

### 返回值

无（`undefined`）。

示例
--

### 使用 clear() 方法


```js
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
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-set.prototype.clear |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `Set`
* `Set.prototype.delete()`
AsyncFunction() 构造函数
====================

Baseline Widely available
-------------------------

This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2017.

* Learn more
* See full compatibility
* Report feedback
**`AsyncFunction()`** 构造函数创建一个新的 `AsyncFunction` 对象。

注意，`AsyncFunction` *不是*全局对象。它可以通过以下代码获取：


```js
const AsyncFunction = async function () {}.constructor;
```


`AsyncFunction()` 构造函数不能直接使用，并且所有在 `Function()` 描述中提到的注意事项都适用于 `AsyncFunction`。

语法
--


```js
new AsyncFunction(functionBody)
new AsyncFunction(arg1, functionBody)
new AsyncFunction(arg1, arg2, functionBody)
new AsyncFunction(arg1, arg2, /\* …, \*/ argN, functionBody)

AsyncFunction(functionBody)
AsyncFunction(arg1, functionBody)
AsyncFunction(arg1, arg2, functionBody)
AsyncFunction(arg1, arg2, /\* …, \*/ argN, functionBody)
```


**备注：** 无论是否使用 `new` 调用 `AsyncFunction()`，都可以创建一个新的 `AsyncFunction` 实例。

### 参数

参见 `Function()`。

示例
--

### 从 AsyncFunction() 构造函数创建异步函数


```js
function resolveAfter2Seconds(x) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(x);
    }, 2000);
  });
}

const AsyncFunction = async function () {}.constructor;

const fn = new AsyncFunction(
  "a",
  "b",
  "return await resolveAfter2Seconds(a) + await resolveAfter2Seconds(b);",
);

fn(10, 20).then((v) => {
  console.log(v); // 4 秒过后，输出 30
});
```

规范
--

| Specification |
| --- |
| ECMAScript Language Specification # sec-async-function-constructor |

浏览器兼容性
------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

参见
--

* `async function` 声明
* `async function` 表达式
* `Function()` 构造函数