Skip to content

fix: 错译和润色 #1196

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jun 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions 1-js/02-first-steps/05-types/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -272,17 +272,17 @@ typeof alert // "function" (3)

## 总结

JavaScript 中有八种基本的数据类型(译注:前七种为基本数据类型,也称为原始数据类型,而 `object` 为复杂数据类型)
JavaScript 中有八种基本的数据类型。

- 七种原始数据类型:
- 七种原始数据类型(基本数据类型)
- `number` 用于任何类型的数字:整数或浮点数,在 <code>±(2<sup>53</sup>-1)</code> 范围内的整数。
- `bigint` 用于任意长度的整数。
- `string` 用于字符串:一个字符串可以包含 0 个或多个字符,所以没有单独的单字符类型。
- `boolean` 用于 `true` 和 `false`。
- `null` 用于未知的值 —— 只有一个 `null` 值的独立类型。
- `undefined` 用于未定义的值 —— 只有一个 `undefined` 值的独立类型。
- `symbol` 用于唯一的标识符。
- 以及一种非原始数据类型:
- 以及一种非原始数据类型(复杂数据类型)
- `object` 用于更复杂的数据结构。

我们可以通过 `typeof` 运算符查看存储在变量中的数据类型。
Expand Down
2 changes: 1 addition & 1 deletion 1-js/09-classes/03-static-properties-methods/article.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@

# 静态属性和静态方法

我们可以把一个方法作为一个整体赋值给类。这样的方法被称为 **静态的(static)**。
我们也可以把一个方法赋值给一整个类。这样的方法被称为 **静态的(static)**。

在一个类的声明中,它们以 `static` 关键字开头,如下所示:

Expand Down
2 changes: 1 addition & 1 deletion 1-js/09-classes/05-extend-natives/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`,就像这样:

Expand Down
8 changes: 4 additions & 4 deletions 1-js/09-classes/07-mixins/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -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* 提供了实现特定行为的方法,但是我们不单独使用它,而是使用它来将这些行为添加到其他类中。

Expand Down Expand Up @@ -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 {
Expand Down
6 changes: 3 additions & 3 deletions 1-js/10-error-handling/1-try-catch/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -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。

Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -662,7 +662,7 @@ try {

Error 对象包含下列属性:

- `message` _ 人类可读的 error 信息。
- `message` —— 人类可读的 error 信息。
- `name` —— 具有 error 名称的字符串(Error 构造器的名称)。
- `stack`(没有标准,但得到了很好的支持)—— Error 发生时的调用栈。

Expand Down
4 changes: 2 additions & 2 deletions 1-js/10-error-handling/2-custom-errors/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ let json = `{ "name": "John", "age": 30 }`;

我们的 `ValidationError` 类应该继承自 `Error` 类。

`Error` 类是内建的,但这是其近似代码,所以我们可以了解我们要扩展的内容
`Error` 类是内建的,但我们可以通过下面这段近似代码理解我们要扩展的内容

```js
// JavaScript 自身定义的内建的 Error 类的“伪代码”
Expand All @@ -36,7 +36,7 @@ class Error {
}
```

现在让我们从其中继承 `ValidationError`,并尝试进行运行
现在让我们从其中继承 `ValidationError` 试一试

```js run untrusted
*!*
Expand Down
2 changes: 1 addition & 1 deletion 1-js/11-async/01-callbacks/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
但是,我们会尽全力使讲解变得更加清晰。在这儿不会有浏览器方面的真正复杂的东西。
```

JavaScript 主机(host)环境提供了许多函数,这些函数允许我们计划 **异步** 行为(action)。换句话说,我们现在开始执行的行为,但它们会在稍后完成
JavaScript 主机(host)环境提供了许多函数,这些函数允许我们计划 **异步** 行为(action)—— 也就是在我们执行一段时间后才自行完成的行为

例如,`setTimeout` 函数就是一个这样的函数。

Expand Down
10 changes: 5 additions & 5 deletions 1-js/11-async/02-promise-basics/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -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` 的调用都会被忽略:
Expand All @@ -99,7 +99,7 @@ let promise = new Promise(function(resolve, reject) {
});
```

这的宗旨是,一个被 executor 完成的工作只能有一个结果或一个 error。
关键就在于,一个由 executor 完成的工作只能有一个结果或一个 error。

并且,`resolve/reject` 只需要一个参数(或不包含任何参数),并且将忽略额外的参数。
````
Expand All @@ -118,7 +118,7 @@ let promise = new Promise(function(resolve, reject) {
});
```

例如,当我们开始做一个任务时,但随后看到一切都已经完成并已被缓存时,可能就会发生这种情况。
例如,当我们开始做一个任务,随后发现一切都已经完成并已被缓存时,可能就会发生这种情况。

这挺好。我们立即就有了一个 resolved 的 promise。
````
Expand Down Expand Up @@ -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 比现实生活中的“订阅列表”方案强大得多。如果歌手已经发布了他们的单曲,然后某个人在订阅列表上进行了注册,则他们很可能不会收到该单曲。实际生活中的订阅必须在活动开始之前进行。
Expand Down Expand Up @@ -357,7 +357,7 @@ promise.then(script => alert('Another handler...'));

| promise | callback |
|----------|-----------|
| promise 允许我们按照自然顺序进行编码。首先,我们运行 `loadScript` `.then` 来处理结果。| 在调用 `loadScript(script, callback)` 时,我们必须有一个 `callback` 函数可供使用。换句话说,在调用 `loadScript` **之前**,我们必须知道如何处理结果。|
| promise 允许我们按照自然顺序进行编码。首先,我们运行 `loadScript`,之后,用 `.then` 来处理结果。| 在调用 `loadScript(script, callback)` 时,我们必须有一个 `callback` 函数可供使用。换句话说,在调用 `loadScript` **之前**,我们必须知道如何处理结果。|
| 我们可以根据需要,在 promise 上多次调用 `.then`。每次调用,我们都会在“订阅列表”中添加一个新的“粉丝”,一个新的订阅函数。在下一章将对此内容进行详细介绍:[](info:promise-chaining)。 | 只能有一个回调。|


Expand Down
6 changes: 3 additions & 3 deletions 1-js/11-async/05-promise-api/article.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)多个用户的信息。即使其中一个请求失败,我们仍然对其他的感兴趣。

Expand Down