Skip to content

Commit

Permalink
patch 1
Browse files Browse the repository at this point in the history
  • Loading branch information
yin1999 committed Jul 16, 2024
1 parent 96b0afa commit 0bfe5e0
Show file tree
Hide file tree
Showing 71 changed files with 207 additions and 468 deletions.
4 changes: 3 additions & 1 deletion files/zh-cn/mozilla/firefox/releases/41/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ title: Firefox 41 for developers
slug: Mozilla/Firefox/Releases/41
---

{{FirefoxSidebar}}[To test the latest developer features of Firefox, install Firefox Developer Edition](https://nightly.mozilla.org/) Firefox 41 was released on September 22, 2015. This article lists key changes that are useful not only for web developers, but also Firefox and Gecko developers as well as add-on developers.
{{FirefoxSidebar}}

[To test the latest developer features of Firefox, install Firefox Developer Edition](https://nightly.mozilla.org/) Firefox 41 was released on September 22, 2015. This article lists key changes that are useful not only for web developers, but also Firefox and Gecko developers as well as add-on developers.

## Changes for Web developers

Expand Down
2 changes: 1 addition & 1 deletion files/zh-cn/web/api/filesystemdirectoryhandle/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ _从父接口 {{DOMxRef("FileSystemHandle")}} 继承方法。_
- : 返回一个新的迭代 `FileSystemDirectoryHandle` 对象内每个条目的键的异步迭代器。
- {{domxref('FileSystemDirectoryHandle.values()')}}
- : 返回一个新的迭代 `FileSystemDirectoryHandle` 对象内每个条目的句柄的异步迭代器。
- `FileSystemDirectoryHandle[@@asyncIterator]()`
- `FileSystemDirectoryHandle[Symbol.asyncIterator]()`
- : 返回给定对象自己的可枚举属性的 `[key, value]` 对的新*异步迭代器*

## 示例
Expand Down
2 changes: 1 addition & 1 deletion files/zh-cn/web/api/readablestream/from_static/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ ReadableStream.from(anyIterable)
### 异常

- {{jsxref("TypeError")}}
- : 如果传入的参数不是可迭代对象或者异步可迭代对象(未定义 `@@iterator``@@asyncIterator` 方法),则抛出。如果在迭代期间,下一步的结果不是对象或者 promise 不能兑现对象,则也会抛出。
- : 如果传入的参数不是可迭代对象或者异步可迭代对象(未定义 `[Symbol.iterator]()``[Symbol.asyncIterator]()` 方法),则抛出。如果在迭代期间,下一步的结果不是对象或者 promise 不能兑现对象,则也会抛出。

## 示例

Expand Down
4 changes: 2 additions & 2 deletions files/zh-cn/web/api/urlsearchparams/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
title: URLSearchParams
slug: Web/API/URLSearchParams
l10n:
sourceCommit: 4de6f76bbfd76229db78ffb7d52cf6b4cb9f31f8
sourceCommit: e92950d09467164afc9dfd8b35be9c909b63a8ab
---

{{ApiRef("URL API")}} {{AvailableInWorkers}}
Expand Down Expand Up @@ -30,7 +30,7 @@ for (const [key, value] of mySearchParams.entries()) {

## 实例方法

- `URLSearchParams.[@@iterator]()`
- `URLSearchParams[Symbol.iterator]()`
- : 返回一个 {{jsxref("Iteration_protocols","iterator")}},允许以键/值对在查询字符串中出现的顺序迭代包含在该对象的键/值对。
- {{domxref("URLSearchParams.append()")}}
- : 插入一个指定的键/值对作为新的查询参数。
Expand Down
16 changes: 8 additions & 8 deletions files/zh-cn/web/javascript/data_structures/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -236,17 +236,17 @@ JavaScript 有一个内置对象的标准库。请阅读[参考页面](/zh-CN/do
- [`+`](/zh-CN/docs/Web/JavaScript/Reference/Operators/Addition) 运算符——如果运算对象是字符串,执行字符串串联;否则,执行数值相加。
- [`==`](/zh-CN/docs/Web/JavaScript/Reference/Operators/Equality) 运算符——如果一个运算对象是原始值,而另一个运算对象是对象(object),则该对象将转换为没有首选类型的原始值。

如果值已经是原始值,则此操作不会进行任何转换。对象将依次调用它的 [`[@@toPrimitive]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive)(将 `default` 作为 hint 值)、`valueOf()``toString()` 方法,将其转换为原始值。注意,原始值转换会在 `toString()` 方法之前调用 `valueOf()` 方法,这与[数字类型强制转换](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number#number_强制转换)的行为相似,但与[字符串类型强制转换](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String#字符串强制转换)不同。
如果值已经是原始值,则此操作不会进行任何转换。对象将依次调用它的 [`[Symbol.toPrimitive]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/toPrimitive)(将 `default` 作为 hint 值)、`valueOf()``toString()` 方法,将其转换为原始值。注意,原始值转换会在 `toString()` 方法之前调用 `valueOf()` 方法,这与[数字类型强制转换](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number#number_强制转换)的行为相似,但与[字符串类型强制转换](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String#字符串强制转换)不同。

`[@@toPrimitive]()` 方法,如果存在,则必须返回原始值——返回对象,会导致 {{jsxref("TypeError")}}。对于 `valueOf()``toString()`,如果其中一个返回对象,则忽略其返回值,从而使用另一个的返回值;如果两者都不存在,或者两者都没有返回一个原始值,则抛出 {{jsxref("TypeError")}}。例如,以下代码:
`[Symbol.toPrimitive]()` 方法,如果存在,则必须返回原始值——返回对象,会导致 {{jsxref("TypeError")}}。对于 `valueOf()``toString()`,如果其中一个返回对象,则忽略其返回值,从而使用另一个的返回值;如果两者都不存在,或者两者都没有返回一个原始值,则抛出 {{jsxref("TypeError")}}。例如,以下代码:

```js
console.log({} + []); // "[object Object]"
```

`{}``[]` 都没有 `[@@toPrimitive]()` 方法。`{}``[]` 都从 {{jsxref("Object.prototype.valueOf")}} 继承 `valueOf()`,其返回对象自身。因为返回值是一个对象,因此它被忽略。因此,调用 `toString()` 方法。[`{}.toString()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString) 返回 `"[object Object]"`,而 [`[].toString()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/toString) 返回 `""`,因此这个结果是它们的串联:`"[object Object]"`
`{}``[]` 都没有 `[Symbol.toPrimitive]()` 方法。`{}``[]` 都从 {{jsxref("Object.prototype.valueOf")}} 继承 `valueOf()`,其返回对象自身。因为返回值是一个对象,因此它被忽略。因此,调用 `toString()` 方法。[`{}.toString()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/toString) 返回 `"[object Object]"`,而 [`[].toString()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/toString) 返回 `""`,因此这个结果是它们的串联:`"[object Object]"`

在强制转换为任意的原始类型时,`[@@toPrimitive]()` 方法总是优先调用。原始值的强制转换的行为通常与 number 类型的强制转换类似,因为优先调用了 `valueOf()`;然而,有着自定义 `[@@toPrimitive]()` 方法的对象可以选择返回任意的原始值。{{jsxref("Date")}} 和 {{jsxref("Symbol")}} 对象是唯一重写 `[@@toPrimitive]()` 方法的对象。[`Date.prototype[@@toPrimitive]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/@@toPrimitive)`"string"` 视为 `"default"` hint,而 [`Symbol.prototype[@@toPrimitive]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/@@toPrimitive) 忽略 hint 并始终返回一个 symbol。
在强制转换为任意的原始类型时,`[Symbol.toPrimitive]()` 方法总是优先调用。原始值的强制转换的行为通常与 number 类型的强制转换类似,因为优先调用了 `valueOf()`;然而,有着自定义 `[Symbol.toPrimitive]()` 方法的对象可以选择返回任意的原始值。{{jsxref("Date")}} 和 {{jsxref("Symbol")}} 对象是唯一重写 `[Symbol.toPrimitive]()` 方法的对象。[`Date.prototype[Symbol.toPrimitive]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Date/Symbol.toPrimitive)`"string"` 视为 `"default"` hint,而 [`Symbol.prototype[Symbol.toPrimitive]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/Symbol.toPrimitive) 忽略 hint 并始终返回一个 symbol。

### 数字类型强制转换

Expand All @@ -260,11 +260,11 @@ console.log({} + []); // "[object Object]"

你可能已经注意到,有三种不同的路径可以将对象转换为原始值:

- [原始值强制转换](#原始值强制转换)`[@@toPrimitive]("default")``valueOf()``toString()`
- [数字类型强制转换](#数字类型强制转换)[number 类型强制转换](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number#number_强制转换)[BigInt 类型强制转换](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt#转化)`[@@toPrimitive]("number")``valueOf()``toString()`
- [字符串类型强制转换](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String#字符串强制转换)`[@@toPrimitive]("string")``toString()``valueOf()`
- [原始值强制转换](#原始值强制转换)`[Symbol.toPrimitive]("default")``valueOf()``toString()`
- [数字类型强制转换](#数字类型强制转换)[number 类型强制转换](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number#number_强制转换)[BigInt 类型强制转换](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/BigInt#转化)`[Symbol.toPrimitive]("number")``valueOf()``toString()`
- [字符串类型强制转换](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String#字符串强制转换)`[Symbol.toPrimitive]("string")``toString()``valueOf()`

在所有情况下,`[@@toPrimitive]()` 如果存在,必须可调用并返回原始值,而如果它们不可调用或返回对象,`valueOf``toString` 将被忽略。在过程结束时,如果成功,结果保证是原始值。然后,由此产生的原始值会进一步强制类型转换,具体取决于上下文。
在所有情况下,`[Symbol.toPrimitive]()` 如果存在,必须可调用并返回原始值,而如果它们不可调用或返回对象,`valueOf``toString` 将被忽略。在过程结束时,如果成功,结果保证是原始值。然后,由此产生的原始值会进一步强制类型转换,具体取决于上下文。

## 参见

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,11 @@ function* makeRangeIterator(start = 0, end = Infinity, step = 1) {

若一个对象拥有迭代行为,比如在 {{jsxref("Statements/for...of", "for...of")}} 中会循环一些值,那么那个对象便是一个可迭代对象。一些内置类型,如 {{jsxref("Array")}} 或 {{jsxref("Map")}} 拥有默认的迭代行为,而其他类型(比如 {{jsxref("Object")}})则没有。

为了实现**可迭代**一个对象必须实现 **@@iterator** 方法,这意味着这个对象(或其[原型链](/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain)中的任意一个对象)必须具有一个键值为 {{jsxref("Symbol.iterator")}} 的属性。
为了实现**可迭代**对象必须实现 `[Symbol.iterator]()` 方法,这意味着这个对象(或其[原型链](/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain)中的任意一个对象)必须具有一个键值为 {{jsxref("Symbol.iterator")}} 的属性。

程序员应知道一个可迭代对象可以多次迭代,还是只能迭代一次。

只能迭代一次的可迭代对象(例如 Generator)通常从它们的 **@@iterator** 方法中返回 `this`,而那些可以多次迭代的方法必须在每次调用 **@@iterator** 时返回一个新的迭代器。
只能迭代一次的可迭代对象(例如生成器)通常从它们的 `[Symbol.iterator]()` 方法中返回 `this`,而那些可以多次迭代的方法必须在每次调用 `[Symbol.iterator]()` 时返回一个新的迭代器。

```js
function* makeIterator() {
Expand All @@ -116,10 +116,10 @@ for (const itItem of it) {
console.log(it[Symbol.iterator]() === it); // true

// 这个例子向我们展示了生成器(迭代器)是可迭代对象,
// 它有一个 @@iterator 方法返回 it(它自己),
// 它有一个 [Symbol.iterator]() 方法返回 it(它自己),
// 因此,it 对象只能迭代*一次*。

// 如果我们将它的 @@iterator 方法改为一个返回新的迭代器/生成器对象的函数/生成器,
// 如果我们将它的 [Symbol.iterator]() 方法改为一个返回新的迭代器/生成器对象的函数/生成器,
// 它(it)就可以迭代多次了。

it[Symbol.iterator] = function* () {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ constructor(...args) {
}
```

> **备注:** 像上面这样的显式构造函数与默认构造函数的区别在于,后者实际上并不通过[参数展开](/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_syntax)来调用[数组迭代器](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/@@iterator)
> **备注:** 像上面这样的显式构造函数与默认构造函数的区别在于,后者实际上并不通过[参数展开](/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_syntax)来调用[数组迭代器](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Symbol.iterator)
这样代码才能正常工作:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ console.log(new ChildClass()); // TypeError: Derived constructors may only retur
然而,要正确地实现上述期望,需要付出不小的努力。

- 第一个要求静态方法读取 [`this`](/zh-CN/docs/Web/JavaScript/Reference/Operators/this) 的值,以获取构造函数来构造返回的实例。这意味着 `[p1,p2,p3].map(Promise.resolve)` 会抛出错误,因为 `Promise.resolve` 中的 `this``undefined`。解决这个问题的方法是,如果 `this` 不是构造函数,就回退到基类,就像 {{jsxref("Array.from()")}} 所做的那样,但这仍然意味着基类是特例。
- 第二个要求实例方法读取 [`this.constructor`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor) 以获取构造函数。但是,`new this.constructor()` 可能会破坏老旧的代码,因为 `constructor` 属性是可写和可配置的,而且不受任何保护。因此,许多复制的内置方法都使用构造函数的 [`@@species`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/species) 属性(默认情况下只返回 `this`,即构造函数本身)。然而,`@@species` 允许运行任意代码和创建任意类型的实例,这就带来了安全问题,并使子类化语义变得非常复杂。
- 第二个要求实例方法读取 [`this.constructor`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/constructor) 以获取构造函数。但是,`new this.constructor()` 可能会破坏老旧的代码,因为 `constructor` 属性是可写和可配置的,而且不受任何保护。因此,许多复制的内置方法都使用构造函数的 [`[Symbol.species]`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Symbol/species) 属性(默认情况下只返回 `this`,即构造函数本身)。然而,`[Symbol.species]` 允许运行任意代码和创建任意类型的实例,这就带来了安全问题,并使子类化语义变得非常复杂。
- 第三个会导致自定义代码的可见调用,从而使很多优化更难实现。例如,如果使用包含 _x_ 个元素的可迭代元素调用 `Map()` 构造函数,那么它必须明显地调用 `set()` 方法 _x_ 次,而不仅仅是将元素复制到内部存储。

这些问题并非内置类所独有。对于你自己的类,你也可能需要做出同样的决定。不过,对于内置类来说,可优化性和安全性是更大的问题。新的内置方法总是构造基类,并尽可能少地调用自定义方法。如果你想在实现上述期望的同时对内置类进行子类化,你需要重写所有已具有默认行为的方法。在基类上添加任何新方法都可能会破坏子类的语义,因为这些方法是默认继承的。因此,扩展内置类的更好方法是使用[_组合_](#避免继承)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,8 @@ var args = [...arguments];
- : 指向参数所属的当前执行的函数。
- [`arguments.length`](/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments/length)
- : 传递给函数的参数数量。
- [`arguments[@@iterator]`](/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments/@@iterator)
- : 返回一个新的 {{jsxref("Array/@@iterator", "Array 迭代器", "", 0)}}对象,该对象包含参数中每个索引的值。
- [`arguments[Symbol.iterator]`](/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments/Symbol.iterator)
- : 返回一个新的[数组迭代器](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Symbol.iterator)对象,该对象包含参数中每个索引的值。

## 示例

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: arguments[@@iterator]()
title: arguments[Symbol.iterator]()
slug: Web/JavaScript/Reference/Functions/arguments/Symbol.iterator
---

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ concat(value0, value1, /* … ,*/ valueN)

如果任何源数组是[稀疏数组](/zh-CN/docs/Web/JavaScript/Guide/Indexed_collections#稀疏数组)`concat()` 方法会保留空槽。

`concat()` 方法是[通用的](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array#通用数组方法)`this` 值的处理方式与其他参数相同(除了它会先转换为对象),这意味着普通对象将直接添加到结果数组中,而 `@@isConcatSpreadable` 属性为真值的类数组对象将展开并添加到数组中。
`concat()` 方法是[通用的](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array#通用数组方法)`this` 值的处理方式与其他参数相同(除了它会先转换为对象),这意味着普通对象将直接添加到结果数组中,而 `[Symbol.isConcatSpreadable]` 属性为真值的类数组对象将展开并添加到数组中。

## 示例

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,6 @@ for (const entry of Array.prototype.entries.call(arrayLike)) {
- {{jsxref("Array")}}
- {{jsxref("Array.prototype.keys()")}}
- {{jsxref("Array.prototype.values()")}}
- [`Array.prototype[@@iterator]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/@@iterator)
- [`Array.prototype[Symbol.iterator]()`](/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Symbol.iterator)
- {{jsxref("TypedArray.prototype.entries()")}}
- [迭代协议](/zh-CN/docs/Web/JavaScript/Reference/Iteration_protocols)
Loading

0 comments on commit 0bfe5e0

Please sign in to comment.