recursal/MDN huggingface dataset:
active
======

**`active`** 是 `MediaStream` 接口的只读属性，返回布尔值，如果媒体流当前为活动状态时，返回 `true` ，否则返回 `false`。至少有一条 `MediaStreamTrack` 的媒体流不是`MediaStreamTrack.ended` 状态时才认为是 **活动的** 。当所有轨道关闭时，媒体流的属性置为 `false`。

语法
--


```js
var isActive = MediaStream.active;
```

### Value

布尔值，当媒体流当前为活动状态时为 `true` ; 否则为 `false`.

样例
--

在这个例子中，使用`getUserMedia()`请求源为用户本地摄像机和麦克风的一条新流，当流可用时（即满足返回的`Promise`），根据该流当前是否处于活动状态来更新页面上的按钮。


```js
var promise = navigator.mediaDevices.getUserMedia({
  audio: true,
  video: true
});

promise.then(function(stream) {
  var startBtn = document.querySelector('#startBtn');
  startBtn.disabled = stream.active;
};)
```

规范
--

| Specification |
| --- |
| Media Capture and Streams # dom-mediastream-active |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
MediaStream.getAudioTracks()
============================

`MediaStream` 接口下的 ***`getAudioTracks()`*** 方法会返回一个包含
 `track set` 流中所有
 `MediaStreamTrack.kind` (en-US) 为 `audio` 的 `MediaStreamTrack` 对象序列。

语法
--


```js
getAudioTracks()
```

### 参数

无

### 返回值

`MediaStreamTrack` 对象数组，包含流中所有的音轨。音轨的 `kind` (en-US) 值为 `audio`
 。如果流中不包含音轨，则数组为空。

**备注：** 数组中返回的顺序并不是由规范定义的，事实上，每次调用 `getAudioTracks()` 的结果都可能有所不同。

更早版本的本 API 中，包含一个用做列表中每个音频类型的 `AudioStreamTrack` 接口；现在已被合并至 `MediaStreamTrack` 主接口中。

示例
--

 本示例使用 `getUserMedia()` 获取视频流中的网络摄像机的音频和视频，并将媒体流绑定到 `<video>`
 元素，然后设置一个计时器，计时器到期时会停止在该媒体流中找到的第一个音轨。


```js
navigator.mediaDevices
  .getUserMedia({ audio: true, video: true })
  .then((mediaStream) => {
    document.querySelector("video").srcObject = mediaStream;
    // Stop the audio stream after 5 seconds
    setTimeout(() => {
      const tracks = mediaStream.getAudioTracks();
      tracks[0].stop();
    }, 5000);
  });
```

规范
--

| Specification |
| --- |
| Media Capture and Streams # dom-mediastream-getaudiotracks |

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

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

**`MediaStream.id`** 只读属性，一个包含 36 个字符的 `DOMString` ，用来作为这个对象的唯一标识符 (GUID) 。

语法
--


```js
var id = mediaStream.id;
```

示例
--


```js
var p = navigator.mediaDevices.getUserMedia({ audio: true, video: true });

p.then(function(stream) {
   console.log(stream.id);
};)
```

规范
--

| Specification |
| --- |
| Media Capture and Streams # dom-mediastream-id |

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

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

相关链接
----

* `MediaStream`，包含该属性的接口。
Headers.has()
=============

`Headers` 接口的 \*\*`has()`\*\*方法返回一个布尔值来声明一个 `Headers`对象 是否包含特定的头信息。

考虑到安全因素，一些头信息只能被 user agent 来管理。这些头信息包括forbidden header names 和forbidden response header names.

Syntax
------


```js
myHeaders.has(name);
```

### Parameters

*name*

你要测试的 HTTP 头字段的名称。如果给出的名称不在 HTTP 头中，将爬出异常`TypeError`。

### Returns

A `Boolean` (en-US).

Example
-------

创建一个空的 Headers 对象是简单的：


```js
var myHeaders = new Headers(); // Currently empty
```


你可以使用 `Headers.append` 来向 myHeaders 添加一个头信息，然后使用 `has()` 方法来测试是否添加成功：


```js
myHeaders.append("Content-Type", "image/jpeg");
myHeaders.has("Content-Type"); // Returns true
myHeaders.has("Accept-Encoding"); // Returns false
```

Specifications
--------------

| Specification |
| --- |
| Fetch Standard # ref-for-dom-headers-has① |

Browser compatibility
---------------------

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

See also
--------

* ServiceWorker API (en-US)
* HTTP access control (CORS)
* HTTP
Headers.get()
=============

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

**`get()`** 方法以 `ByteString` 形式从 Headers 对象中返回指定 header 的全部值。如果 Header 对象中不存在请求的 header，则返回 `null`。

**备注：** 出于安全原因，部分头信息只能被用户代理控制。这些头信息包括 forbidden header names 和 forbidden response header names。

Syntax
------


```js
myHeaders.get(name);
```

### Parameters

*name*

从 Headers 对象中检索的 HTTP header 名，如果 HTTP header 中不存在指定 header 名则会抛出一个`TypeError`.

### Returns

以 `ByteString` 形式返回检索到的值。

Example
-------

创建一个空的 Headers 对象：


```js
var myHeaders = new Headers(); // Currently empty
```


可以通过 get() 方法来获取 header 中的值：


```js
myHeaders.append("Content-Type", "image/jpeg");
myHeaders.get("Content-Type"); // Returns 'image/jpeg'
```


如果存在多个 header 值，那么只有第一个值会被返回：


```js
myHeaders.append("Accept-Encoding", "deflate");
myHeaders.append("Accept-Encoding", "gzip");
myHeaders.get("Accept-Encoding"); // Returns "deflate,gzip"
```


**备注：** `Headers.getAll` used to have this functionality, with `Headers.get` returning only the first value added to the `Headers` object. The latest spec has removed `getAll()`, and updated `get()` to return all values.

Specifications
--------------

| Specification |
| --- |
| Fetch Standard # ref-for-dom-headers-get① |

Browser compatibility
---------------------

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

See also
--------

* ServiceWorker API (en-US)
* HTTP access control (CORS)
* HTTP
Headers.values()
================

**`Headers.values()`** 方法返回一个可迭代数值，通过这个数值可以遍历 **`Headers`** 中键值对的 **`value`** 值。返回的 **`value`** 都是 **`ByteString`** 对象。

**备注：** 这个方法可以在 Web Workers中使用。

语法
--


```js
headers.values();
```

### 返回值

返回一个由键值对中 **`value`** 组成的数组。

例子
--


```js
// Create a test Headers object
var myHeaders = new Headers();
myHeaders.append("Content-Type", "text/xml");
myHeaders.append("Vary", "Accept-Language");

// Display the values
for (var value of myHeaders.values()) {
  console.log(value);
}
```


返回值为：
```

text/xml
Accept-Language
```

Browser compatibility
---------------------

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

See also
--------

* ServiceWorker API (en-US)
* HTTP access control (CORS)
* HTTP
Headers.keys()
==============

**`Headers.keys()`** 方法返回一个 headers(Object) 对象所有 key 组成的迭代器，通过迭代器可以遍历 headers 这个对象，返回的迭代器中的元素 key 都是字符串。

**备注：** 这个方法在 Web Workers 也可以使用。

语法
--
```

headers.keys();
```

### 返回值

返回 `headers` 对象中所有 key 组成的迭代器 `iterator`。

示例
--


```js
// 创建一个 Headers 对象
var myHeaders = new Headers();
myHeaders.append("Content-Type", "text/xml");
myHeaders.append("Vary", "Accept-Language");

// 显示 Headers 中所有的 key
for (var key of myHeaders.keys()) {
  console.log(key);
}
```


控制台打印结果：
```

content-type
vary
```

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

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

参见
--

* ServiceWorker API
* HTTP 访问控制（CORS）
* HTTP
Headers.append()
================

在一个`Headers`对象内部，`Headers`接口的 **`append()`** 方法可以追加一个新值到已存在的 headers 上，或者新增一个原本不存在的 header。

`Headers.set` 和 `append()` 两者之间的不同之处在于当指定 header 是已经存在的并且允许接收多个值时，`Headers.set`会重写此值为新值，而`append()`会追加到值序列的尾部。

因为安全性原因，一些 headers 仅受用户代理控制。包括forbidden header names和forbidden response header names。

语法
--


```js
append(name, value)
```

### 参数

*name*

要追加给 Headers 对象的 HTTP header 名称。

*value*

要追加给 Headers 对象的 HTTP header 值。

### 返回

Void.

例程
--

创建一个空的 Headers 对象：


```js
var myHeaders = new Headers(); // Currently empty
```


可以通过 append() 方法添加 header:


```js
myHeaders.append("Content-Type", "image/jpeg");
myHeaders.get("Content-Type"); // Returns 'image/jpeg'
```


如果指定 header 不存在，`append()`将会添加这个 header 并赋值 . 如果指定 header 已存在并允许有多个值，`append()`将会把指定值添加到值队列的末尾。


```js
myHeaders.append("Accept-Encoding", "deflate");
myHeaders.append("Accept-Encoding", "gzip");
myHeaders.getAll("Accept-Encoding"); // Returns [ "deflate", "gzip" ]
```


要使用新值覆盖旧值，请使用`Headers.set`。

规范
--

| Specification |
| --- |
| Fetch Standard # ref-for-dom-headers-append① |

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

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

参见
--

* ServiceWorker API (en-US)
* HTTP access control (CORS)
* HTTP
Headers：delete() 方法
===================

`Headers` 接口的 **`delete()`** 方法可以从当前 `Headers` 对象中删除指定标头。

下列原因将会导致该方法抛出 `TypeError`：

* name 参数的值不是 HTTP 标头的名称。
* Guard 的值为 `immutable`。

出于安全原因，部分标头信息只能由用户代理控制。这些标头信息包括禁止修改的标头和禁止修改的响应标头。

语法
--


```js
delete(name)
```

### 参数

`name`

你想要从 `Headers` 对象中删除的 HTTP 标头的名称。

### 返回值

无（`undefined`）。

示例
--

创建一个空的 `Headers` 对象很简单：


```js
const myHeaders = new Headers(); // 目前为空
```


你可以通过 `Headers.append` 方法添加标头：


```js
myHeaders.append("Content-Type", "image/jpeg");
myHeaders.get("Content-Type"); // 返回 'image/jpeg'
```


然后你可以删除它。


```js
myHeaders.delete("Content-Type");
myHeaders.get("Content-Type"); // 返回 null，因为它已被删除
```

规范
--

| Specification |
| --- |
| Fetch Standard # ref-for-dom-headers-delete① |

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

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

参见
--

* ServiceWorker API
* HTTP 访问控制（CORS）
* HTTP
Headers.entries()
=================

**`Headers.entries()`** 以`迭代器`的形式返回 Headers 对象中所有的键值对。每一对中的键和值都是 `String` 对象。

**备注：** 这个方法在 Web Worker 中是可用的。

语法
--


```js
entries()
```

### 参数

无。

### 返回值

返回一个迭代器。

示例
--


```js
// 创建一个测试 Headers 对象
const myHeaders = new Headers();
myHeaders.append("Content-Type", "text/xml");
myHeaders.append("Vary", "Accept-Language");

// 显示键/值对
for (const pair of myHeaders.entries()) {
  console.log(`${pair[0]}: ${pair[1]}`);
}
```


运行结果为：
```

content-type: text/xml
vary: Accept-Language
```

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

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

参见
--

* ServiceWorker API
* HTTP 访问控制（CORS）
* HTTP
Headers.set()
=============

`Headers` 接口中 **`set()`** 方法在可以在已经声明中的 **`headers`** 对象修改已有的一组键值对或者创建一个新的键值对。

**`set()`** 方法和 append()方法不同的是声明的 **`Headers`** 对象是否已经存在对应的 **`keys`** 是否已经存在并且已经赋值。**`set()`** 方法将会覆盖之前的 **`value`**，然而 append()方法只会在 **`Headers`** 对象的尾部添加一个新的键值对。

为了安全策略，一些 \*\*`Headers`\*\*对象中的键值对只能客户端去控制。这些 **`key`** 包括Forbidden response header name 和 Forbidden responese header names 。

语法
--
```

myHeaders.set(name, value);
```

### 参数

`name`

**`name`**就是需要对 HTTP header 设置新值的 key，一般为字符串。如果设置的**`name`** 不是 HTTP header 规范里面规定的 name，那么将会抛出错误"TypeError"。

`value`

**`value`** 就是 **`name`** 对应的值。

### 返回

Void.

Example
-------

创建一个新的 `Headers` 对象：


```js
var myHeaders = new Headers(); // Currently empty
```


你可以用append()方法给`Headers` 对象增添一个新的键值对，然后用 **`set()`** 方法去改变这个键值对：


```js
myHeaders.append("Content-Type", "image/jpeg");
myHeaders.set("Content-Type", "text/html");
```


如果这个键值对不存在，那么 **`set()`** 方法首先创建一个键值对，然后给它赋值。如果这个键值对存在，那么 **`set()`** 方法将会覆盖之前的 **`value`** 值：


```js
myHeaders.set("Accept-Encoding", "deflate");
myHeaders.set("Accept-Encoding", "gzip");
myHeaders.get("Accept-Encoding"); // Returns 'gzip'
```


如果你需要增加一个键值对，而不是要覆盖之前的键值对，那么你需要用append()方法。

Specifications
--------------

| Specification |
| --- |
| Fetch Standard # ref-for-dom-headers-set① |

Browser compatibility
---------------------

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

See also
--------

* ServiceWorker API (en-US)
* HTTP access control (CORS)
* HTTP
Headers()
=========

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

使用 `Headers()` 构造方法创建一个新的 `Headers` 对象。

Syntax
------


```js
var myHeaders = new Headers(init);
```

### Parameters

*init* 可选

通过一个包含任意 HTTP headers 的对象来预设你的 `Headers`. 可以是一个`ByteString` 对象; 或者是一个已存在的 `Headers` 对象。

Example
-------

创建一个空的 `Headers` 对象：


```js
var myHeaders = new Headers(); // Currently empty
```


你可以使用`Headers.append`方法添加一个 header 并赋值：


```js
myHeaders.append("Content-Type", "image/jpeg");
myHeaders.get("Content-Type"); // Returns 'image/jpeg'
```


或者你可以在 Headers 对象创建时添加多个 header. 在下面的示例中我们创建了一个新的`Headers` 对象，并通过 Headers 构造函数中 init 属性来添加多个 header:


```js
var httpHeaders = {
  "Content-Type": "image/jpeg",
  "Accept-Charset": "utf-8",
  "X-My-Custom-Header": "Zeke are cool",
};
var myHeaders = new Headers(httpHeaders);
```


`你可以通过 init 属性将一个已存在的 Headers 对象来创建另一个新的 Headers 对象`:


```js
var secondHeadersObj = new Headers(myHeaders);
secondHeadersObj.get("Content-Type"); // Would return 'image/jpeg' — it inherits it from the first headers object
```

Specifications
--------------

| Specification |
| --- |
| Fetch Standard # ref-for-dom-headers① |

Browser compatibility
---------------------

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

See also
--------

* ServiceWorker API (en-US)
* HTTP access control (CORS)
* HTTP
PerformanceObserver.disconnect()
================================

`PerformanceObserver` 接口的 **`disconnect()`** 方法用于阻止性能观察者接收任何 性能条目 事件。

语法
--


```js
disconnect()
```

### 参数

无。

### 返回值

无（`undefined`）。

示例
--


```js
var observer = new PerformanceObserver(function (list, obj) {
  var entries = list.getEntries();
  for (var i = 0; i < entries.length; i++) {
    // Process "mark" and "frame" events
  }
});
observer.observe({ entryTypes: ["mark", "frame"] });

function perf\_observer(list, observer) {
  // Process the "measure" event
  // ...
  // Disable additional performance events
  observer.disconnect();
}
var observer2 = new PerformanceObserver(perf_observer);
observer2.observe({ entryTypes: ["measure"] });
```

规范
--

| Specification |
| --- |
| Performance Timeline # dom-performanceobserver-disconnect |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
PerformanceObserver.observe()
=============================

`性能监测对象` 的 **`observe()`** 方法用于观察传入的参数中指定的性能条目类型的集合。当记录一个指定类型的性能条目时，性能监测对象的回调函数将会被调用。

语法
--


```js
observer.observe(options);
```

### 参数

* *options*
    + : 一个只装了单个键值对的对象，该键值对的键名规定为 `entryTypes`。`entryTypes` 的取值要求如下：
    + `entryTypes` 的值：一个放字符串的数组，字符串的有效值取值在`性能条目类型` 中有详细列出。如果其中的某个字符串取的值无效，浏览器会自动忽略它。
    + 另：若未传入 `options` 实参，或传入的 `options` 实参为空数组，会抛出 `TypeError`。
示例
--


```js
/\* 写法一 \*/

//直接往 PerformanceObserver() 入参匿名回调函数，成功 new 了一个 PerformanceObserver 类的，名为 observer 的对象
var observer = new PerformanceObserver(function (list, obj) {
  var entries = list.getEntries();
  for (var i = 0; i < entries.length; i++) {
    //处理“mark”和“frame”事件
  }
});
//调用 observer 对象的 observe() 方法
observer.observe({ entryTypes: ["mark", "frame"] });

/\* 写法二 \*/

//预先声明回调函数 perf\_observer
function perf\_observer(list, observer) {
  //处理“measure”事件
}
//再将其传入 PerformanceObserver()，成功 new 了一个 PerformanceObserver 类的，名为 observer2 的对象
var observer2 = new PerformanceObserver(perf_observer);
//调用 observer2 对象的 observe() 方法
observer2.observe({ entryTypes: ["measure"] });
```

规范
--

| Specification |
| --- |
| Performance Timeline # dom-performanceobserver-observe |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
PerformanceObserver.takeRecords()
=================================

`PerformanceObserver` 接口的 **`takeRecords()`** 方法返回当前存储在性能观察器中的`性能条目`列表，并将其清空。

语法
--


```js
var PerformanceEntry[] = performanceObserver.takeRecords();
```

### 参数

无。

### 返回值

`PerformanceEntry` 对象列表。

例子
--


```js
var observer = new PerformanceObserver(function (list, obj) {
  var entries = list.getEntries();
  for (var i = 0; i < entries.length; i++) {
    // Process "mark" and "frame" events
  }
});
observer.observe({ entryTypes: ["mark", "frame"] });
var records = observer.takeRecords();
console.log(records[0].name);
console.log(records[0].startTime);
console.log(records[0].duration);
```

规范
--

| Specification |
| --- |
| Performance Timeline # dom-performanceobserver-takerecords |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
PerformanceObserver()
=====================

**`PerformanceObserver()`** 构造函数使用给定的观察者 `callback` 生成一个新的 `PerformanceObserver` 对象。当通过 `observe()` 方法注册的 条目类型 的 性能条目事件 被记录下来时，调用该观察者回调。

语法
--


```js
var observer = new PerformanceObserver(callback);
```

### 参数

`callback`

观察的性能事件被记录时将调用 `PerformanceObserverCallback` 回调。调用回调时，其第一个参数是 性能观察条目列表 (en-US)，第二个参数是 `观察者` 对象。

### 返回值

一个在观察的性能事件发生时调用指定的 `callback` 的新 `PerformanceObserver` 对象。

例子
--


```js
var observer = new PerformanceObserver(function (list, obj) {
  var entries = list.getEntries();
  for (var i = 0; i < entries.length; i++) {
    // Process "mark" and "frame" events
  }
});
observer.observe({ entryTypes: ["mark", "frame"] });

function perf\_observer(list, observer) {
  // Process the "measure" event
}
var observer2 = new PerformanceObserver(perf_observer);
observer2.observe({ entryTypes: ["measure"] });
```

规范
--

| Specification |
| --- |
| Performance Timeline # dom-performanceobserver-constructor |

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

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

`AudioDestinationNode` 接口的 `maxchannelCount` 属性是一个表示物理设备能处理最大通道数的无符号长整型数。

`AudioNode.channelCount` (en-US) 属性值只能在 0 和这个值 (两端包含) 之间。如果 `maxChannelCount`为 `0`,例如在 `OfflineAudioContext`, 表示音频通道不能被改变。

语法
--


```js
var audioCtx = new AudioContext();
var myDestination = audioCtx.destination;
myDestination.maxChannelCount = 2;
```

### 值

一个无符号长整型数

例子
--

下面假设了一个简单的音频环境，设置其中 `AudioDestinationNode` 的 `maxChannelCount` 值为 2：


```js
var audioCtx = new AudioContext();
var source = audioCtx.createMediaElementSource(myMediaElement);
source.connect(gainNode);
audioCtx.destination.maxChannelCount = 2;
gainNode.connect(audioCtx.destination);
```


为看到一个更完整的实施，请访问我们的 MDN Web Audio 例子，如 Voice-change-o-matic 或者 Violent Theremin.

规范
--

| Specification |
| --- |
| Web Audio API # dom-audiodestinationnode-maxchannelcount |

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

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

其他
--

* Using the Web Audio API (en-US)
WritableStream.locked
=====================

`WritableStream` 接口的只读属性 **`locked`** 返回一个布尔值，表示 `WritableStream` 是否锁定到一个 writer。

值
-

一个布尔值，表示可写流是否已锁定。

示例
--


```js
const writableStream = new WritableStream({
  write(chunk) {
    ...
  },
  close() {
    ...
  },
  abort(err) {
    ...
  }
}, queuingStrategy);
...
const writer = writableStream.getWriter();
writableStream.locked
// should return true, as the stream has been locked to a writer
```

规范
--

| Specification |
| --- |
| Streams Standard # ref-for-ws-locked② |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
WritableStream.abort()
======================

`WritableStream` 接口的 **`abort()`** 方法用于中止流，表示生产者不能再向流写入数据（会立刻返回一个错误状态），并丢弃所有已入队的数据。

语法
--


```js
abort(reason)
```

### 参数

`reason`

一个字符串，用于提供人类可读的中止原因。

### 返回值

一个 `Promise`，会在成功时用给定的 `reason` 参数兑现。

### 异常

`TypeError`

它尝试中止的流不是一个 `WritableStream`，或者它已被锁定。

示例
--


```js
const writableStream = new WritableStream({
  write(chunk) {
    ...
  },
  close() {
    ...
  },
  abort(err) {
    ...
  }
}, queuingStrategy);
...
// abort the stream later on, when required
writableStream.abort();
```

规范
--

| Specification |
| --- |
| Streams Standard # ref-for-ws-abort③ |

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

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.
WritableStream.getWriter()
==========================

`WritableStream` 接口的 **`getWriter()`** 方法返回一个新的 `WritableStreamDefaultWriter` 实例并且将流锁定到该实例。当流被锁定时，直到这个流被释放之前，不能获取其他 writer。

语法
--


```js
getWriter()
```

### 参数

无。

### 返回值

一个 `WritableStreamDefaultWriter` 对象实例。

### 异常

`TypeError`

你尝试为其创建 writer 的流并不是一个 `WritableStream`。

示例
--

下面的例子说明了这个接口的几个功能。它展示了使用自定义接收器和由 API 提供的队列策略创建的 `WritableStream`。然后它调用一个 `sendMessage()` 的函数，传递新创建的流和一个字符串。在这个函数内部，它调用流的 `getWriter()` 方法，该方法返回一个 `WritableStreamDefaultWriter` 实例。`forEach()` 用于将字符串的每个分块写入流。最后，`write()` 和 `close()` 方法都会返回 promise，promise 的状态由对应的操作是否成功来决定。


```js
const list = document.querySelector("ul");
function sendMessage(message, writableStream) {
  // defaultWriter is of type WritableStreamDefaultWriter
  const defaultWriter = writableStream.getWriter();
  const encoder = new TextEncoder();
  const encoded = encoder.encode(message, { stream: true });
  encoded.forEach((chunk) => {
    defaultWriter.ready
      .then(() => {
        return defaultWriter.write(chunk);
      })
      .then(() => {
        console.log("Chunk written to sink.");
      })
      .catch((err) => {
        console.log("Chunk error:", err);
      });
  });
  // Call ready again to ensure that all chunks are written
  // before closing the writer.
  defaultWriter.ready
    .then(() => {
      defaultWriter.close();
    })
    .then(() => {
      console.log("All chunks written");
    })
    .catch((err) => {
      console.log("Stream error:", err);
    });
}
const decoder = new TextDecoder("utf-8");
const queuingStrategy = new CountQueuingStrategy({ highWaterMark: 1 });
let result = "";
const writableStream = new WritableStream(
  {
    // Implement the sink
    write(chunk) {
      return new Promise((resolve, reject) => {
        var buffer = new ArrayBuffer(1);
        var view = new Uint8Array(buffer);
        view[0] = chunk;
        var decoded = decoder.decode(view, { stream: true });
        var listItem = document.createElement("li");
        listItem.textContent = "Chunk decoded: " + decoded;
        list.appendChild(listItem);
        result += decoded;
        resolve();
      });
    },
    close() {
      var listItem = document.createElement("li");
      listItem.textContent = "[MESSAGE RECEIVED] " + result;
      list.appendChild(listItem);
    },
    abort(err) {
      console.log("Sink error:", err);
    },
  },
  queuingStrategy,
);
sendMessage("Hello, world.", writableStream);
```


你可以在我们的简单的 writer 示例找到完整代码。

规范
--

| Specification |
| --- |
| Streams Standard # ref-for-ws-get-writer① |

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

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

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

一个 `EventListener` 联动的属性，其会被任何 stagechange 类型事件抛出时联动; 它也基本上能在任何时候`ServiceWorker.state` 改变时被抛出。

语法
--
```

ServiceWorker.onstatechange = function(statechangeevent) { ... }
ServiceWorker.addEventListener('statechange', function(statechangeevent) { ... } )
```

示例
--

这段代码出自 service worker registration-events sample (live demo). 它会监听 `ServiceWorker.state` 的改变并返回它的值。


```js
var serviceWorker;
if (registration.installing) {
  serviceWorker = registration.installing;
  document.querySelector("#kind").textContent = "installing";
} else if (registration.waiting) {
  serviceWorker = registration.waiting;
  document.querySelector("#kind").textContent = "waiting";
} else if (registration.active) {
  serviceWorker = registration.active;
  document.querySelector("#kind").textContent = "active";
}

if (serviceWorker) {
  logState(serviceWorker.state);
  serviceWorker.addEventListener("statechange", function (e) {
    logState(e.target.state);
  });
}
```


注意当`statechange` 抛出时，service worker 的引用可能已经改变。例如：


```js
navigator.serviceWorker.register(..).then(function(swr) {
  swr.installing.state == "installing"
  swr.installing.onstatechange = function() {
    swr.installing == null;
    // At this point, swr.waiting OR swr.active might be true. This is because the statechange
    // event gets queued, meanwhile the underlying worker may have gone into the waiting
    // state and will be immediately activated if possible.
  }
})
```

规范
--

| Specification |
| --- |
| Service Workers # dom-serviceworker-onstatechange |

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

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

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

作为 `ServiceWorkerRegistration` 的一部分定义，会返回该 ServiceWorker 的序列化脚本 `url`。必须与 document 注册 `ServiceWorker` 的地址同源。

语法
--
```

someURL = ServiceWorker.scriptURL
```

### 值

一个 `USVString` (另见 WebIDL definition of USVString.)

规范
--

| Specification |
| --- |
| Service Workers # service-worker-url |

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

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