Skip to content

Commit

Permalink
Remove all @@notation from page slugs
Browse files Browse the repository at this point in the history
  • Loading branch information
yin1999 committed Jul 16, 2024
1 parent 53d0bb4 commit 96b0afa
Show file tree
Hide file tree
Showing 25 changed files with 189 additions and 207 deletions.
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
---
title: arguments[@@iterator]()
slug: Web/JavaScript/Reference/Functions/arguments/Symbol.iterator
original_slug: Web/JavaScript/Reference/Functions/arguments/@@iterator
---

{{jsSidebar("Functions")}}

**`@@iterator`** 属性的初始值是和 {{jsxref("Array.prototype.values")}} 属性的初始值相同的对象
{{jsxref("Functions/arguments", "arguments")}} 对象的 **`[Symbol.iterator]()`** 方法实现了[可迭代协议](/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols)并允许 `arguments` 对象被大多数期望可迭代对象的语法消费,例如[展开语法](/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_syntax){{jsxref("Statements/for...of", "for...of")}} 循环。它返回一个[数组迭代器对象](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Iterator),该对象会产生 `arguments` 对象中每个索引的值

## 语法

```plain
```js-nolint
arguments[Symbol.iterator]()
```

## 示例

### 使用`for...of`循环的迭代
### 使用 for...of 循环的迭代

```js
function f() {
Expand All @@ -37,6 +36,6 @@ f("w", "y", "k", "o", "p");

{{Compat}}

## 更多
## 参见

- {{jsxref("Array.prototype.values()")}}
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
---
title: Array.prototype[@@iterator]()
slug: Web/JavaScript/Reference/Global_Objects/Array/Symbol.iterator
original_slug: Web/JavaScript/Reference/Global_Objects/Array/@@iterator
---

{{JSRef}}

{{jsxref("Array")}} 实例的 **`[@@iterator]()`** 方法实现了[迭代协议](/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols),允许数组被大多数期望可迭代对象的语法所使用,例如[展开语法](/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_syntax)和 {{jsxref("Statements/for...of", "for...of")}} 循环。它返回一个[数组迭代器对象](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Iterator),该对象会产生数组中每个索引的值。
{{jsxref("Array")}} 实例的 **`[Symbol.iterator]()`** 方法实现了[可迭代协议](/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols),允许数组被大多数期望可迭代对象的语法所使用,例如[展开语法](/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_syntax)和 {{jsxref("Statements/for...of", "for...of")}} 循环。它返回一个[数组迭代器对象](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Iterator),该对象会产生数组中每个索引的值。

该属性的初始值与 {{jsxref("Array.prototype.values")}} 属性的初始值是相同的函数对象。

Expand All @@ -26,7 +25,7 @@ array[Symbol.iterator]()

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

请注意,你很少需要直接调用此方法。`@@iterator` 方法的存在使数组[可迭代](/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols#可迭代协议),并且像 `for...of` 循环这样的迭代语法会自动调用此方法以获得要遍历的迭代器。
请注意,你很少需要直接调用此方法。`[Symbol.iterator]()` 方法的存在使数组[可迭代](/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols#可迭代协议),并且像 `for...of` 循环这样的迭代语法会自动调用此方法以获得要遍历的迭代器。

#### HTML

Expand Down Expand Up @@ -66,7 +65,7 @@ console.log(arrIter.next().value); // e

### 使用相同的函数处理字符串和字符串数组

因为[字符串](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/@@iterator)和数组都实现了可迭代协议,所以可以设计一个通用函数以相同的方式处理这两种输入。这比直接调用 {{jsxref("Array.prototype.values()")}} 更好,后者要求输入是一个数组,或者至少是一个具有这种方法的对象。
因为[字符串](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/Symbol.iterator)和数组都实现了可迭代协议,所以可以设计一个通用函数以相同的方式处理这两种输入。这比直接调用 {{jsxref("Array.prototype.values()")}} 更好,后者要求输入是一个数组,或者至少是一个具有这种方法的对象。

```js
function logIterable(it) {
Expand Down Expand Up @@ -106,13 +105,13 @@ logIterable(123);

## 参见

- [`core-js``Array.prototype[@@iterator]` 的 polyfill](https://github.com/zloirock/core-js#ecmascript-array)
- [`core-js``Array.prototype[Symbol.iterator]` 的 polyfill](https://github.com/zloirock/core-js#ecmascript-array)
- [索引集合类](/zh-CN/docs/Web/JavaScript/Guide/Indexed_collections)
- {{jsxref("Array")}}
- {{jsxref("Array.prototype.keys()")}}
- {{jsxref("Array.prototype.entries()")}}
- {{jsxref("Array.prototype.values()")}}
- [`TypedArray.prototype[@@iterator]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/@@iterator)
- [`String.prototype[@@iterator]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/@@iterator)
- [`TypedArray.prototype[Symbol.iterator]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/Symbol.iterator)
- [`String.prototype[Symbol.iterator]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/Symbol.iterator)
- {{jsxref("Symbol.iterator")}}
- [迭代协议](/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols)
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
---
title: Array[@@species]
title: Array[Symbol.species]
slug: Web/JavaScript/Reference/Global_Objects/Array/Symbol.species
original_slug: Web/JavaScript/Reference/Global_Objects/Array/@@species
---

{{JSRef}}

**`Array[@@species]`** 是一个静态访问器属性,用于返回构造函数,构造函数用于构造数组方法返回值。
**`Array[Symbol.species]`** 静态访问器属性返回构造函数,构造函数用于构造数组方法返回值。

> **警告:** `@@species` 的存在允许执行任意代码,这可能会产生安全漏洞。它还会使某些优化变得更加困难。引擎开发者正在[调查是否要移除此特性](https://github.com/tc39/proposal-rm-builtin-subclassing)。如果可能,请避免依赖它。现代数组方法,如 {{jsxref("Array/toReversed", "toReversed()")}},不使用 `@@species` 且始终返回一个新的 `Array` 基类实例。
> **警告:** `[Symbol.species]` 的存在允许执行任意代码,这可能会产生安全漏洞。它还会使某些优化变得更加困难。引擎开发者正在[调查是否要移除此特性](https://github.com/tc39/proposal-rm-builtin-subclassing)。如果可能,请避免依赖它。现代数组方法,如 {{jsxref("Array/toReversed", "toReversed()")}},不使用 `[Symbol.species]` 且始终返回一个新的 `Array` 基类实例。
## 语法

Expand All @@ -18,11 +17,11 @@ Array[Symbol.species]

### 返回值

`get @@species` 被调用的构造函数 (`this`) 的值。该返回值用于构造创建新数组的数组方法的返回值。
`get [Symbol.species]` 被调用的构造函数`this`的值。该返回值用于构造创建新数组的数组方法的返回值。

## 描述

`@@species` 访问器属性返回 `Array` 对象的默认构造函数。子类的构造函数可能会覆盖并改变构造函数的赋值。默认实现基本上是这样的:
`[Symbol.species]` 访问器属性返回 `Array` 对象的默认构造函数。子类的构造函数可能会覆盖并改变构造函数的赋值。默认实现基本上是这样的:

```js
// 以下是一个用于说明的假设底层实现
Expand All @@ -33,14 +32,14 @@ class Array {
}
```

由于这种多态实现,派生子类的 `@@species` 默认情况下也会返回构造函数本身。
由于这种多态实现,派生子类的 `[Symbol.species]` 默认情况下也会返回构造函数本身。

```js
class SubArray extends Array {}
SubArray[Symbol.species] === SubArray; // true
```

调用不会改变现有数组但会返回新数组实例的数组方法时(例如 [`filter()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)[`map()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map)),将访问数组的 `constructor[@@species]`。返回的构造函数将用于构造数组方法的返回值。这使得在技术上使数组方法返回与数组无关的对象成为可能。
调用不会改变现有数组但会返回新数组实例的数组方法时(例如 [`filter()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)[`map()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map)),将访问数组的 `constructor[Symbol.species]`。返回的构造函数将用于构造数组方法的返回值。这使得在技术上使数组方法返回与数组无关的对象成为可能。

```js
class NotAnArray {
Expand All @@ -60,7 +59,7 @@ arr.concat([1, 2]); // NotAnArray { '0': 0, '1': 1, '2': 2, '3': 1, '4': 2, leng

### 普通对象中的 species

`@@species` 属性返回默认构造函数,对于 `Array` 来说,它就是 `Array` 构造函数。
`[Symbol.species]` 属性返回默认构造函数,对于 `Array` 来说,它就是 `Array` 构造函数。

```js
Array[Symbol.species]; // [Function: Array]
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
---
title: Array.prototype[@@unscopables]
title: Array.prototype[Symbol.unscopables]
slug: Web/JavaScript/Reference/Global_Objects/Array/Symbol.unscopables
original_slug: Web/JavaScript/Reference/Global_Objects/Array/@@unscopables
---

{{JSRef}}

`Array.prototype`**`@@unscopables`** 数据属性被所有 {{jsxref("Array")}} 实例共享。它包含在 ES2015 版本之前 ECMAScript 标准中未收纳的属性名,并且这些属性被排除在由 [`with`](/zh-CN/docs/Web/JavaScript/Reference/Statements/with) 语句绑定的环境中。
`Array.prototype`**`[Symbol.unscopables]`** 数据属性被所有 {{jsxref("Array")}} 实例共享。它包含在 ES2015 版本之前 ECMAScript 标准中未收纳的属性名,并且这些属性被排除在由 [`with`](/zh-CN/docs/Web/JavaScript/Reference/Statements/with) 语句绑定的环境中。

##

Expand Down Expand Up @@ -35,7 +34,7 @@ original_slug: Web/JavaScript/Reference/Global_Objects/Array/@@unscopables
- [`toSpliced()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/toSpliced)
- [`values()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/values)

`Array.prototype[@@unscopables]` 是一个只包含所有上述属性且对应值为 `true` 的空对象。它的[原型是 `null`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object#null_原型对象),因此不会意外地使 `Object.prototype` 属性(比如 [`toString`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString))变为非作用域属性,而令在 `with` 语句中调用数组的 `toString()` 方法仍然有效。
`Array.prototype[Symbol.unscopables]` 是一个只包含所有上述属性且对应值为 `true` 的空对象。它的[原型是 `null`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object#null_原型对象),因此不会意外地使 `Object.prototype` 属性(比如 [`toString`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString))变为非作用域属性,而令在 `with` 语句中调用数组的 `toString()` 方法仍然有效。

请参阅 {{jsxref("Symbol.unscopables")}} 了解如何为自定义对象设置非作用域属性。

Expand All @@ -51,9 +50,9 @@ with (Array.prototype) {
}
```

当 ECMAScript 2015 引入 {{jsxref("Array.prototype.keys()")}} 方法时,如果 `@@unscopables` 数据属性也没有被引入,那么 `keys.push('something')` 调用将会出现问题——因为 JavaScript 运行时会将 `keys` 解释为 {{jsxref("Array.prototype.keys()")}} 方法,而不是示例代码中定义的 `keys` 数组。
当 ECMAScript 2015 引入 {{jsxref("Array.prototype.keys()")}} 方法时,如果 `[Symbol.unscopables]` 数据属性也没有被引入,那么 `keys.push('something')` 调用将会出现问题——因为 JavaScript 运行时会将 `keys` 解释为 {{jsxref("Array.prototype.keys()")}} 方法,而不是示例代码中定义的 `keys` 数组。

因此,`Array.prototype``@@unscopables` 数据属性使得 ECMAScript 2015 中引入的 `Array` 属性在 `with` 语句绑定时被忽略,从而使得在 ECMAScript 2015 之前编写的代码继续按预期工作,而不会出现问题。
因此,`Array.prototype``[Symbol.unscopables]` 数据属性使得 ECMAScript 2015 中引入的 `Array` 属性在 `with` 语句绑定时被忽略,从而使得在 ECMAScript 2015 之前编写的代码继续按预期工作,而不会出现问题。

## 规范

Expand All @@ -65,7 +64,7 @@ with (Array.prototype) {

## 参见

- [`core-js``Array.prototype[@@unscopables]` 的 polyfill](https://github.com/zloirock/core-js#ecmascript-array)
- [`core-js``Array.prototype[Symbol.unscopables]` 的 polyfill](https://github.com/zloirock/core-js#ecmascript-array)
- [索引集合类](/zh-CN/docs/Web/JavaScript/Guide/Indexed_collections)
- {{jsxref("Array")}}
- {{jsxref("Statements/with", "with")}}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
---
title: ArrayBuffer[@@species]
title: ArrayBuffer[Symbol.species]
slug: Web/JavaScript/Reference/Global_Objects/ArrayBuffer/Symbol.species
original_slug: Web/JavaScript/Reference/Global_Objects/ArrayBuffer/@@species
l10n:
sourceCommit: bf81c9ed7de8cfd94cf1fc7f77e23b987f753a8b
sourceCommit: 6fbdb78c1362fae31fbd545f4b2d9c51987a6bca
---

{{JSRef}}

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

> **警告:** `@@species` 的存在允许任意代码执行,并可能产生安全漏洞。这也使某些优化变得更加困难。引擎实现者正在[调查是否删除此特性](https://github.com/tc39/proposal-rm-builtin-subclassing)。如果可能的话,请避免依赖它。
> **警告:** `[Symbol.species]` 的存在允许任意代码执行,并可能产生安全漏洞。这也使某些优化变得更加困难。引擎实现者正在[调查是否删除此特性](https://github.com/tc39/proposal-rm-builtin-subclassing)。如果可能的话,请避免依赖它。
## 语法

Expand All @@ -20,11 +19,11 @@ ArrayBuffer[Symbol.species]

### 返回值

调用 `get @@species` 的构造函数(`this`)的值。该返回值被用于构造创建新的数组缓冲区的数组缓冲区方法的返回值。
调用 `get [Symbol.species]` 的构造函数(`this`)的值。该返回值被用于构造创建新的数组缓冲区的数组缓冲区方法的返回值。

## 描述

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

```js
// 用于说明的假设基础实现
Expand All @@ -42,13 +41,13 @@ class SubArrayBuffer extends ArrayBuffer {}
SubArrayBuffer[Symbol.species] === SubArrayBuffer; // true
```

当调用不会修改现有对象,而是返回一个新的数组缓冲区实例数组缓冲区方法(例如,[`slice()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/slice))时,对象的 `constructor[@@species]` 将被访问。返回的构造函数将用于构造该数组缓冲区方法的返回值。
当调用不会修改现有对象,而是返回一个新的数组缓冲区实例数组缓冲区方法(例如,[`slice()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer/slice))时,对象的 `constructor[Symbol.species]` 将被访问。返回的构造函数将用于构造该数组缓冲区方法的返回值。

## 示例

### 普通对象中的 species

`@@species` 属性返回默认构造函数,即 `ArrayBuffer` 构造函数。
`[Symbol.species]` 属性返回默认构造函数,即 `ArrayBuffer` 构造函数。

```js
ArrayBuffer[Symbol.species]; // function ArrayBuffer()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
---
title: AsyncIterator.prototype[@@asyncIterator]()
title: AsyncIterator.prototype[Symbol.asyncIterator]()
slug: Web/JavaScript/Reference/Global_Objects/AsyncIterator/Symbol.asyncIterator
original_slug: Web/JavaScript/Reference/Global_Objects/AsyncIterator/@@asyncIterator
l10n:
sourceCommit: 27180875516cc311342e74b596bfb589b7211e0c
sourceCommit: 6fbdb78c1362fae31fbd545f4b2d9c51987a6bca
---

{{JSRef}}

{{jsxref("AsyncIterator")}} 实例的 **`[@@asyncIterator]()`** 方法实现了[异步可迭代协议](/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols#异步迭代器和异步可迭代协议)并允许内置的异步迭代器被大多数期望异步迭代器的语法所接受,如 [`for await...of`](/zh-CN/docs/Web/JavaScript/Reference/Statements/for-await...of) 循环。它返回 [`this`](/zh-CN/docs/Web/JavaScript/Reference/Operators/this) 的值,即异步迭代器对象本身。
{{jsxref("AsyncIterator")}} 实例的 **`[Symbol.asyncIterator]()`** 方法实现了[异步可迭代协议](/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols#异步迭代器和异步可迭代协议)并允许内置的异步迭代器被大多数期望异步迭代器的语法所接受,如 [`for await...of`](/zh-CN/docs/Web/JavaScript/Reference/Statements/for-await...of) 循环。它返回 [`this`](/zh-CN/docs/Web/JavaScript/Reference/Operators/this) 的值,即异步迭代器对象本身。

{{EmbedInteractiveExample("pages/js/map-prototype-@@iterator.html")}}

Expand All @@ -30,7 +29,7 @@ asyncIterator[Symbol.asyncIterator]()

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

请注意,你很少需要直接调用该方法。`@@asyncIterator` 方法的存在使得所有内置的异步迭代器都成为[异步可迭代](/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols#异步迭代器和异步可迭代协议)对象,而像 `for await...of` 循环这样的迭代语法会自动调用该方法来获取异步迭代器来进行循环。
请注意,你很少需要直接调用该方法。`[Symbol.asyncIterator]()` 方法的存在使得所有内置的异步迭代器都成为[异步可迭代](/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols#异步迭代器和异步可迭代协议)对象,而像 `for await...of` 循环这样的迭代语法会自动调用该方法来获取异步迭代器来进行循环。

```js
const asyncIterator = (async function* () {
Expand Down
Loading

0 comments on commit 96b0afa

Please sign in to comment.