From dd9f7f4bba35fb6983352efe3846e989bacd8bba Mon Sep 17 00:00:00 2001
From: omvjro <144692181+omvjro@users.noreply.github.com>
Date: Fri, 1 Mar 2024 07:29:35 +0000
Subject: [PATCH 1/5] feat: polish
---
1-js/02-first-steps/05-types/article.md | 6 +++---
.../09-classes/03-static-properties-methods/article.md | 2 +-
1-js/09-classes/05-extend-natives/article.md | 2 +-
1-js/09-classes/07-mixins/article.md | 8 ++++----
1-js/10-error-handling/1-try-catch/article.md | 6 +++---
1-js/10-error-handling/2-custom-errors/article.md | 4 ++--
1-js/11-async/01-callbacks/article.md | 2 +-
1-js/11-async/02-promise-basics/article.md | 10 +++++-----
1-js/11-async/05-promise-api/article.md | 6 +++---
9 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/1-js/02-first-steps/05-types/article.md b/1-js/02-first-steps/05-types/article.md
index fe2a9905b4..c149b7899f 100644
--- a/1-js/02-first-steps/05-types/article.md
+++ b/1-js/02-first-steps/05-types/article.md
@@ -272,9 +272,9 @@ typeof alert // "function" (3)
## 总结
-JavaScript 中有八种基本的数据类型(译注:前七种为基本数据类型,也称为原始数据类型,而 `object` 为复杂数据类型)。
+JavaScript 中有八种基本的数据类型。
-- 七种原始数据类型:
+- 七种原始数据类型(基本数据类型):
- `number` 用于任何类型的数字:整数或浮点数,在 ±(253-1) 范围内的整数。
- `bigint` 用于任意长度的整数。
- `string` 用于字符串:一个字符串可以包含 0 个或多个字符,所以没有单独的单字符类型。
@@ -282,7 +282,7 @@ JavaScript 中有八种基本的数据类型(译注:前七种为基本数据
- `null` 用于未知的值 —— 只有一个 `null` 值的独立类型。
- `undefined` 用于未定义的值 —— 只有一个 `undefined` 值的独立类型。
- `symbol` 用于唯一的标识符。
-- 以及一种非原始数据类型:
+- 以及一种非原始数据类型(复杂数据类型):
- `object` 用于更复杂的数据结构。
我们可以通过 `typeof` 运算符查看存储在变量中的数据类型。
diff --git a/1-js/09-classes/03-static-properties-methods/article.md b/1-js/09-classes/03-static-properties-methods/article.md
index 400e76093d..0d56ea6ce5 100644
--- a/1-js/09-classes/03-static-properties-methods/article.md
+++ b/1-js/09-classes/03-static-properties-methods/article.md
@@ -1,7 +1,7 @@
# 静态属性和静态方法
-我们可以把一个方法作为一个整体赋值给类。这样的方法被称为 **静态的(static)**。
+我们也可以把一个方法赋值给一整个类。这样的方法被称为 **静态的(static)**。
在一个类的声明中,它们以 `static` 关键字开头,如下所示:
diff --git a/1-js/09-classes/05-extend-natives/article.md b/1-js/09-classes/05-extend-natives/article.md
index c81b0b31cb..121970d71e 100644
--- a/1-js/09-classes/05-extend-natives/article.md
+++ b/1-js/09-classes/05-extend-natives/article.md
@@ -32,7 +32,7 @@ arr.constructor === PowerArray
甚至,我们可以定制这种行为。
-我们可以给这个类添加一个特殊的静态 getter `Symbol.species`。如果存在,则应返回 JavaScript 在内部用来在 `map` 和 `filter` 等方法中创建新实体的 `constructor`。
+我们可以给这个类添加一个特殊的静态 getter `Symbol.species`,它会返回 JavaScript 在内部用来在 `map` 和 `filter` 等方法中创建新实体的 `constructor`。
如果我们希望像 `map` 或 `filter` 这样的内建方法返回常规数组,我们可以在 `Symbol.species` 中返回 `Array`,就像这样:
diff --git a/1-js/09-classes/07-mixins/article.md b/1-js/09-classes/07-mixins/article.md
index 6ce70767cc..8209ea075c 100644
--- a/1-js/09-classes/07-mixins/article.md
+++ b/1-js/09-classes/07-mixins/article.md
@@ -2,13 +2,13 @@
在 JavaScript 中,我们只能继承单个对象。每个对象只能有一个 `[[Prototype]]`。并且每个类只可以扩展另外一个类。
-但是有些时候这种设定(译注:单继承)会让人感到受限制。例如,我有一个 `StreetSweeper` 类和一个 `Bicycle` 类,现在想要一个它们的 mixin:`StreetSweepingBicycle` 类。
+但是有些时候这种设定(译注:单继承)会让人感到受限制。例如,我有一个 `StreetSweeper` 类和一个 `Bicycle` 类,现在想要一个它们的混合体:`StreetSweepingBicycle` 类。
或者,我们有一个 `User` 类和一个 `EventEmitter` 类来实现事件生成(event generation),并且我们想将 `EventEmitter` 的功能添加到 `User` 中,以便我们的用户可以触发事件(emit event)。
-有一个概念可以帮助我们,叫做 "mixins"。
+有一个概念可以帮助我们,叫做 "mixin"。
-根据维基百科的定义,[mixin](https://en.wikipedia.org/wiki/Mixin) 是一个包含可被其他类使用而无需继承的方法的类。
+根据维基百科的定义,[mixin](https://en.wikipedia.org/wiki/Mixin) 是一个类,其方法可被其他类使用,而无需继承。
换句话说,*mixin* 提供了实现特定行为的方法,但是我们不单独使用它,而是使用它来将这些行为添加到其他类中。
@@ -47,7 +47,7 @@ Object.assign(User.prototype, sayHiMixin);
new User("Dude").sayHi(); // Hello Dude!
```
-这里没有继承,只有一个简单的方法拷贝。所以 `User` 可以从另一个类继承,还可以包括 mixin 来 "mix-in“ 其它方法,就像这样:
+这里没有继承,只有一个简单的方法拷贝。因此,我们可以让 `User` 在继承另一个类的同时,使用 mixin 来 "mix-in" (混合)其它方法,就像这样:
```js
class User extends Person {
diff --git a/1-js/10-error-handling/1-try-catch/article.md b/1-js/10-error-handling/1-try-catch/article.md
index 5bdc6d49a5..744c079a7b 100644
--- a/1-js/10-error-handling/1-try-catch/article.md
+++ b/1-js/10-error-handling/1-try-catch/article.md
@@ -489,7 +489,7 @@ try {
1. 如果你对于 "Make an error?" 的回答是 "Yes",那么执行 `try -> catch -> finally`。
2. 如果你的回答是 "No",那么执行 `try -> finally`。
-`finally` 子句(clause)通常用在:当我们开始做某事的时候,希望无论出现什么情况都要完成完成某个任务。
+`finally` 子句(clause)通常用在:当我们开始做某事的时候,希望无论出现什么情况都要完成某个任务。
例如,我们想要测量一个斐波那契数字函数 `fib(n)` 执行所需要花费的时间。通常,我们可以在运行它之前开始测量,并在运行完成时结束测量。但是,如果在该函数调用期间出现 error 该怎么办?特别是,下面这段 `fib(n)` 的实现代码在遇到负数或非整数数字时会返回一个 error。
@@ -565,7 +565,7 @@ alert( func() ); // 先执行 finally 中的 alert,然后执行这个 alert
````smart header="`try...finally`"
-没有 `catch` 子句的 `try...finally` 结构也很有用。当我们不想在这儿处理 error(让它们 fall through),但是需要确保我们启动的处理需要被完成。
+没有 `catch` 子句的 `try...finally` 结构也很有用。当我们不想在原地处理 error(让它们掉出去吧),但是需要确保我们启动的处理需要被完成时,我们应当使用它。
```js
function func() {
@@ -662,7 +662,7 @@ try {
Error 对象包含下列属性:
-- `message` _ 人类可读的 error 信息。
+- `message` —— 人类可读的 error 信息。
- `name` —— 具有 error 名称的字符串(Error 构造器的名称)。
- `stack`(没有标准,但得到了很好的支持)—— Error 发生时的调用栈。
diff --git a/1-js/10-error-handling/2-custom-errors/article.md b/1-js/10-error-handling/2-custom-errors/article.md
index ac80c7d102..e25dfe3b74 100644
--- a/1-js/10-error-handling/2-custom-errors/article.md
+++ b/1-js/10-error-handling/2-custom-errors/article.md
@@ -23,7 +23,7 @@ let json = `{ "name": "John", "age": 30 }`;
我们的 `ValidationError` 类应该继承自 `Error` 类。
-`Error` 类是内建的,但这是其近似代码,所以我们可以了解我们要扩展的内容:
+`Error` 类是内建的,但我们可以通过下面这段近似代码理解我们要扩展的内容:
```js
// JavaScript 自身定义的内建的 Error 类的“伪代码”
@@ -36,7 +36,7 @@ class Error {
}
```
-现在让我们从其中继承 `ValidationError`,并尝试进行运行:
+现在让我们从其中继承 `ValidationError` 试一试:
```js run untrusted
*!*
diff --git a/1-js/11-async/01-callbacks/article.md b/1-js/11-async/01-callbacks/article.md
index abc233e45a..f8477abbbb 100644
--- a/1-js/11-async/01-callbacks/article.md
+++ b/1-js/11-async/01-callbacks/article.md
@@ -10,7 +10,7 @@
但是,我们会尽全力使讲解变得更加清晰。在这儿不会有浏览器方面的真正复杂的东西。
```
-JavaScript 主机(host)环境提供了许多函数,这些函数允许我们计划 **异步** 行为(action)。换句话说,我们现在开始执行的行为,但它们会在稍后完成。
+JavaScript 主机(host)环境提供了许多函数,这些函数允许我们计划 **异步** 行为(action)——也就是在我们执行一段时间后才自行完成的行为。
例如,`setTimeout` 函数就是一个这样的函数。
diff --git a/1-js/11-async/02-promise-basics/article.md b/1-js/11-async/02-promise-basics/article.md
index 675ec81431..3742e09b20 100644
--- a/1-js/11-async/02-promise-basics/article.md
+++ b/1-js/11-async/02-promise-basics/article.md
@@ -83,7 +83,7 @@ let promise = new Promise(function(resolve, reject) {
与最初的 "pending" promise 相反,一个 resolved 或 rejected 的 promise 都会被称为 "settled"。
-````smart header="这只能有一个结果或一个 error"
+````smart header="只有一个结果或一个 error"
executor 只能调用一个 `resolve` 或一个 `reject`。任何状态的更改都是最终的。
所有其他的再对 `resolve` 和 `reject` 的调用都会被忽略:
@@ -99,7 +99,7 @@ let promise = new Promise(function(resolve, reject) {
});
```
-这的宗旨是,一个被 executor 完成的工作只能有一个结果或一个 error。
+关键就在于,一个由 executor 完成的工作只能有一个结果或一个 error。
并且,`resolve/reject` 只需要一个参数(或不包含任何参数),并且将忽略额外的参数。
````
@@ -118,7 +118,7 @@ let promise = new Promise(function(resolve, reject) {
});
```
-例如,当我们开始做一个任务时,但随后看到一切都已经完成并已被缓存时,可能就会发生这种情况。
+例如,当我们开始做一个任务,随后发现一切都已经完成并已被缓存时,可能就会发生这种情况。
这挺好。我们立即就有了一个 resolved 的 promise。
````
@@ -294,7 +294,7 @@ new Promise((resolve, reject) => {
// 下面这 promise 在被创建后立即变为 resolved 状态
let promise = new Promise(resolve => resolve("done!"));
-promise.then(alert); // done!(现在显示)
+promise.then(alert); // done!(立刻显示)
```
请注意这使得 promise 比现实生活中的“订阅列表”方案强大得多。如果歌手已经发布了他们的单曲,然后某个人在订阅列表上进行了注册,则他们很可能不会收到该单曲。实际生活中的订阅必须在活动开始之前进行。
@@ -357,7 +357,7 @@ promise.then(script => alert('Another handler...'));
| promise | callback |
|----------|-----------|
-| promise 允许我们按照自然顺序进行编码。首先,我们运行 `loadScript` 和 `.then` 来处理结果。| 在调用 `loadScript(script, callback)` 时,我们必须有一个 `callback` 函数可供使用。换句话说,在调用 `loadScript` **之前**,我们必须知道如何处理结果。|
+| promise 允许我们按照自然顺序进行编码。首先,我们运行 `loadScript`,之后(then),用 `.then` 来处理结果。| 在调用 `loadScript(script, callback)` 时,我们必须有一个 `callback` 函数可供使用。换句话说,在调用 `loadScript` **之前**,我们必须知道如何处理结果。|
| 我们可以根据需要,在 promise 上多次调用 `.then`。每次调用,我们都会在“订阅列表”中添加一个新的“粉丝”,一个新的订阅函数。在下一章将对此内容进行详细介绍:[](info:promise-chaining)。 | 只能有一个回调。|
diff --git a/1-js/11-async/05-promise-api/article.md b/1-js/11-async/05-promise-api/article.md
index 9fdaa2d57e..246d1c6565 100644
--- a/1-js/11-async/05-promise-api/article.md
+++ b/1-js/11-async/05-promise-api/article.md
@@ -131,10 +131,10 @@ Promise.all([
]).then(render); // render 方法需要所有 fetch 的数据
```
-`Promise.allSettled` 等待所有的 promise 都被 settle,无论结果如何。结果数组具有:
+`Promise.allSettled` 等待所有的 promise 都被 settle,无论结果如何。结果数组会是这样的:
-- `{status:"fulfilled", value:result}` 对于成功的响应,
-- `{status:"rejected", reason:error}` 对于 error。
+- 若响应成功,为 `{status:"fulfilled", value:result}`,
+- 若出现 error,为 `{status:"rejected", reason:error}`。
例如,我们想要获取(fetch)多个用户的信息。即使其中一个请求失败,我们仍然对其他的感兴趣。
From 6a9675a9d1c7ed8f6ce8becf7591028139bb1d2f Mon Sep 17 00:00:00 2001
From: omvjro <144692181+omvjro@users.noreply.github.com>
Date: Fri, 1 Mar 2024 15:45:22 +0800
Subject: [PATCH 2/5] Update article.md
---
1-js/11-async/05-promise-api/article.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/1-js/11-async/05-promise-api/article.md b/1-js/11-async/05-promise-api/article.md
index 246d1c6565..1b5599601f 100644
--- a/1-js/11-async/05-promise-api/article.md
+++ b/1-js/11-async/05-promise-api/article.md
@@ -133,8 +133,8 @@ Promise.all([
`Promise.allSettled` 等待所有的 promise 都被 settle,无论结果如何。结果数组会是这样的:
-- 若响应成功,为 `{status:"fulfilled", value:result}`,
-- 若出现 error,为 `{status:"rejected", reason:error}`。
+- 对成功的响应,结果数组对应元素的内容为 `{status:"fulfilled", value:result}`,
+- 对出现 error 的响应,结果数组对应元素的内容为 `{status:"rejected", reason:error}`。
例如,我们想要获取(fetch)多个用户的信息。即使其中一个请求失败,我们仍然对其他的感兴趣。
From e8ea93dbfdfbc773fd09a594a8cd6ce485c034a1 Mon Sep 17 00:00:00 2001
From: LeviDing
Date: Sun, 30 Jun 2024 18:27:49 +0800
Subject: [PATCH 3/5] Update article.md
---
1-js/09-classes/07-mixins/article.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/1-js/09-classes/07-mixins/article.md b/1-js/09-classes/07-mixins/article.md
index 8209ea075c..38a8abd747 100644
--- a/1-js/09-classes/07-mixins/article.md
+++ b/1-js/09-classes/07-mixins/article.md
@@ -47,7 +47,7 @@ Object.assign(User.prototype, sayHiMixin);
new User("Dude").sayHi(); // Hello Dude!
```
-这里没有继承,只有一个简单的方法拷贝。因此,我们可以让 `User` 在继承另一个类的同时,使用 mixin 来 "mix-in" (混合)其它方法,就像这样:
+这里没有继承,只有一个简单的方法拷贝。因此,我们可以让 `User` 在继承另一个类的同时,使用 mixin 来 "mix-in"(混合)其它方法,就像这样:
```js
class User extends Person {
From e53620e2024b55331e1bf419a4d342a762e517aa Mon Sep 17 00:00:00 2001
From: LeviDing
Date: Sun, 30 Jun 2024 18:30:39 +0800
Subject: [PATCH 4/5] Update article.md
---
1-js/11-async/01-callbacks/article.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/1-js/11-async/01-callbacks/article.md b/1-js/11-async/01-callbacks/article.md
index f8477abbbb..6899f32be8 100644
--- a/1-js/11-async/01-callbacks/article.md
+++ b/1-js/11-async/01-callbacks/article.md
@@ -10,7 +10,7 @@
但是,我们会尽全力使讲解变得更加清晰。在这儿不会有浏览器方面的真正复杂的东西。
```
-JavaScript 主机(host)环境提供了许多函数,这些函数允许我们计划 **异步** 行为(action)——也就是在我们执行一段时间后才自行完成的行为。
+JavaScript 主机(host)环境提供了许多函数,这些函数允许我们计划 **异步** 行为(action)—— 也就是在我们执行一段时间后才自行完成的行为。
例如,`setTimeout` 函数就是一个这样的函数。
From 8a98c4239ea4f606d5f427c9ff7f4ed0ba0d2d62 Mon Sep 17 00:00:00 2001
From: LeviDing
Date: Sun, 30 Jun 2024 18:32:11 +0800
Subject: [PATCH 5/5] Update article.md
---
1-js/11-async/02-promise-basics/article.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/1-js/11-async/02-promise-basics/article.md b/1-js/11-async/02-promise-basics/article.md
index 3742e09b20..ac1acc70cf 100644
--- a/1-js/11-async/02-promise-basics/article.md
+++ b/1-js/11-async/02-promise-basics/article.md
@@ -357,7 +357,7 @@ promise.then(script => alert('Another handler...'));
| promise | callback |
|----------|-----------|
-| promise 允许我们按照自然顺序进行编码。首先,我们运行 `loadScript`,之后(then),用 `.then` 来处理结果。| 在调用 `loadScript(script, callback)` 时,我们必须有一个 `callback` 函数可供使用。换句话说,在调用 `loadScript` **之前**,我们必须知道如何处理结果。|
+| promise 允许我们按照自然顺序进行编码。首先,我们运行 `loadScript`,之后,用 `.then` 来处理结果。| 在调用 `loadScript(script, callback)` 时,我们必须有一个 `callback` 函数可供使用。换句话说,在调用 `loadScript` **之前**,我们必须知道如何处理结果。|
| 我们可以根据需要,在 promise 上多次调用 `.then`。每次调用,我们都会在“订阅列表”中添加一个新的“粉丝”,一个新的订阅函数。在下一章将对此内容进行详细介绍:[](info:promise-chaining)。 | 只能有一个回调。|