未验证 提交 e1c7f9ee 编写于 作者: 飞龙 提交者: GitHub

Merge pull request #15 from 52admln/master

28.数组(Array)翻译完毕
......@@ -2,36 +2,36 @@
> 原文: [http://exploringjs.com/impatient-js/ch_arrays.html](http://exploringjs.com/impatient-js/ch_arrays.html)
### 28.1。 JavaScript 中数组的两个角色
### 28.1。 JavaScript 中数组的两个角色
数组在 JavaScript 中扮演两个角色:
* 元组:Arrays-as-tuples 具有固定数量的索引元素。这些元素中的每一个都可以具有不同的类型。
* 序列:Arrays-as-sequences 具有可变数量的索引元素。每个元素都具有相同的类型。
实际上,这两种角色也有其混合物
实际上,数组一般都由这两个角色组成
值得注意的是,Arrays-as-sequences 非常灵活,您可以将它们用作(传统)数组,堆栈和队列(请参阅本章末尾的练习)。
### 28.2。基本数组操作
### 28.2。数组基本操作
#### 28.2.1。数组:创建,阅读,写作
#### 28.2.1。数组:创建,读取,更改
创建数组的最佳方法是通过 _ 数组字面值 _:
创建数组的最佳方法是使用 _数组字面量_:
```js
const arr = ['a', 'b', 'c'];
```
Array 字面值以方括号`[]`开头和结尾。它创建一个包含三个 _ 元素 _ 的数组:`'a'``'b'``'c'`
数组(`Array`)字面量以方括号`[]`开头和结尾。它创建了一个包含三个 _元素_ 的数组:`'a'``'b'``'c'`
要读取 Array 元素,请将索引放在方括号中(索引从零开始):
要读取数组(`Array`)元素,请在方括号中填入索引(索引从零开始):
```js
assert.equal(arr[0], 'a');
```
要更改 Array 元素,请为具有索引的 Array 指定
要更改数组(`Array`)元素,可以使用对应索引修改其值
```js
arr[0] = 'x';
......@@ -42,7 +42,7 @@ assert.deepEqual(arr, ['x', 'b', 'c']);
#### 28.2.2。数组:`.length`
每个 Array 都有一个属性`.length`,可用于读取和更改(!)数组中元素的数量。
每个数组(`Array`都有一个属性`.length`,可用于读取和更改(!)数组中元素的数量。
数组的长度始终是最高的索引加一:
......@@ -52,7 +52,7 @@ assert.deepEqual(arr, ['x', 'b', 'c']);
2
```
如果在长度的索引处写入数组,则追加一个元素:
如果使用长度作为索引值写入数组,则会追加一个元素:
```js
> arr[arr.length] = 'c';
......@@ -62,7 +62,7 @@ assert.deepEqual(arr, ['x', 'b', 'c']);
3
```
(破坏性地)附加元素的另一种方法是通过 Array 方法`.push()`
(破坏性地)附加元素的另一种方法是通过数组(`Array`方法`.push()`
```js
> arr.push('d');
......@@ -70,7 +70,7 @@ assert.deepEqual(arr, ['x', 'b', 'c']);
[ 'a', 'b', 'c', 'd' ]
```
如果设置`.length`,则通过删除元素来修剪数组
如果设置`.length`,则会通过删除元素来设置数组长度
```js
> arr.length = 1;
......@@ -82,9 +82,9 @@ assert.deepEqual(arr, ['x', 'b', 'c']);
`exercises/arrays/remove_empty_lines_push_test.js`
#### 28.2.3。传播到数组
#### 28.2.3。数组字面量展开
Arrry 字面值中,_ 扩展元素 _ 由三个点(`...`)组成,后跟一个表达式。它导致表达式被评估然后迭代。每个迭代值都成为一个额外的 Array 元素。例如:
数组(`Array`)字面量中,_扩展运算符_ 由三个点(`...`)组成,后跟一个表达式。它导致表达式重新计算迭代,最后形成一个新的数组。例如:
```js
> const iterable = ['b', 'c'];
......@@ -92,7 +92,7 @@ assert.deepEqual(arr, ['x', 'b', 'c']);
[ 'a', 'b', 'c', 'd' ]
```
传播很方便将数组和其他迭代连接到数组中
扩展运算符可以很方便地将两个数组合并起来
```js
const arr1 = ['a', 'b'];
......@@ -104,7 +104,7 @@ assert.deepEqual(
['a', 'b', 'c', 'd', 'e']);
```
#### 28.2.4。数组:列出索引和条目
#### 28.2.4。数组:列出索引和属性
方法`.keys()`列出数组的索引:
......@@ -115,7 +115,7 @@ assert.deepEqual(
[0, 1]);
```
`.keys()`返回一个可迭代的。在 A 行,我们传播以获得一个数组。
`.keys()`返回一个可迭代的。在 A 行,我们通过扩展运算符生成了一个数组。
列表数组索引与列表属性不同。当你执行后者时,你得到索引 - 但作为字符串 - 加上非索引属性键:
......@@ -148,7 +148,7 @@ true
true
```
`instanceof`通常很好。如果某个值可能来自另一个 __,则需要`Array.isArray()`。粗略地说,领域是 JavaScript 全局范围的一个实例。一些领域彼此隔离(例如浏览器中的 [Web Workers](ch_async-js.html#web-workers) ),但也有一些领域可以移动数据(例如浏览器中的同源 iframe)。 `x instanceof Array`检查`x`的原型链,因此如果`x`是来自另一个域的数组,则返回`false`
`instanceof`通常很好。如果某个值可能来自另一个 __,则需要`Array.isArray()`。粗略地说,领域是 JavaScript 全局范围的一个实例。一些领域彼此隔离(例如浏览器中的 [Web Workers](ch_async-js.html#web-workers) ),但也有一些领域可以移动数据(例如浏览器中的同源 iframe)。 `x instanceof Array`检查`x`的原型链,因此如果`x`是来自另一个域的数组,则返回`false`
`typeof`将数组归类为对象:
......@@ -187,9 +187,9 @@ for (const [index, element] of ['a', 'b'].entries()) {
// 1, 'b'
```
### 28.4。类似于数组的对象
### 28.4。类数组对象
一些使用 Arrays 的操作只需要最小值:值必须只是 _ 类似于 _。类似数组的值是具有以下属性的对象:
一些使用 Arrays 的操作只需要最小值:值必须只是 _类似于数组_。类数组是具有以下属性的对象:
* `.length`:保存类似 Array 的对象的长度。
* `['0']`:将元素保持在索引 0 处。(等等)
......@@ -222,9 +222,9 @@ assert.deepEqual(
将可迭代和类似数组的值转换为数组有两种常用方法:扩展和`Array.from()`
#### 28.5.1。通过传播将迭代转换为数组(`...`)
#### 28.5.1。通过扩展运算符(`...`)将迭代转换为数组
在 Array 文本中,通过`...`传播将任何可迭代对象转换为一系列 Array 元素。例如:
在 Array 字面量中,通过 `...` 将任何可迭代对象转换为一系列 Array 元素。例如:
```js
// Get an Array-like collection from a web browser’s DOM
......@@ -296,16 +296,16 @@ assert.deepEqual(
### 28.6。创建和填充任意长度的数组
创建数组的最佳方法是通过数组字面。但是,您不能总是使用一个:数组可能太大,您可能在开发过程中不知道它的长度,或者您可能希望保持其长度灵活。然后我推荐以下用于创建和填充数组的技术:
创建数组的最佳方法是通过数组字面。但是,您不能总是使用一个:数组可能太大,您可能在开发过程中不知道它的长度,或者您可能希望保持其长度灵活。然后我推荐以下用于创建和填充数组的技术:
* 你需要创建一个你将完全填充的空数组,后呢?
* 你需要创建一个你将完全填充的空数组,后呢?
```js
> new Array(3)
[ , , ,]
```
请注意,结果有 3 个孔 - 数组字面中的最后一个逗号始终被忽略。
请注意,结果有 3 个孔 - 数组字面中的最后一个逗号始终被忽略。
* 你需要创建一个用原始值初始化的数组吗?
......@@ -333,7 +333,7 @@ assert.deepEqual(
[2, 3, 4]);
```
如果您正在处理整数或浮点数的数组,请考虑 [_ 类型数组 _](ch_typed-arrays.html) - 这是为此目的而创建的。
如果您正在处理整数或浮点数的数组,请考虑 [_类型数组_](ch_typed-arrays.html) - 这是为此目的而创建的。
### 28.7。多维数组
......@@ -392,7 +392,7 @@ assert.equal(arr['0'], 'a'); // (C)
更令人困惑的是,这只是语言规范如何定义事物(JavaScript 的理论,如果你愿意的话)。大多数 JavaScript 引擎都经过优化,并且使用数字(甚至是整数)来访问 Array 元素(如果你愿意,可以使用 JavaScript 的实践)。
用于 Array 元素的属性键(字符串!)称为 _ 索引 _。字符串`str`是将其转换为 32 位无符号整数并返回后生成原始值的索引。写成公式:
用于 Array 元素的属性键(字符串!)称为 _索引_。字符串`str`是将其转换为 32 位无符号整数并返回后生成原始值的索引。写成公式:
```js
ToString(ToUint32(key)) === key
......@@ -426,16 +426,16 @@ assert.deepEqual(
我们使用扩展元素(`...`)将`.keys()``.entries()`返回的迭代转换为数组。
#### 28.8.2。数组是字典,可以有
#### 28.8.2。数组是字典,可以有空元素
JavaScript 支持两种数组:
* 密集数组:是数组形成连续序列的数组。这是迄今为止我们见过的唯一一种数组。
* 稀疏数组:包含空的数组。也就是说,一些指数缺失。
* 稀疏数组:包含空元素的数组。也就是说,一些指数缺失。
一般来说,最好避免漏洞,因为它们会使代码更复杂,并且不会被 Array 方法一致地处理。此外,JavaScript 引擎优化密集数组,因此它们更快。
您可以在分配元素时通过跳过索引来创建
您可以在分配元素时通过跳过索引来创建空数组元素
```js
const arr = [];
......@@ -448,9 +448,9 @@ assert.equal(0 in arr, true); // element
assert.equal(1 in arr, false); // hole
```
在 A 行中,我们使用`Object.keys()`,因为`arr.keys()`视为`undefined`元素并且不会显示它们。
在 A 行中,我们使用`Object.keys()`,因为`arr.keys()`空元素视为`undefined`元素并且不会显示它们。
另一种创建漏洞的方法是跳过数组字面中的元素:
另一种创建漏洞的方法是跳过数组字面中的元素:
```js
const arr = ['a', , 'c'];
......@@ -885,7 +885,7 @@ assert.deepEqual(
* 数组。例如,Array 的副本,元素乘以 2。
* 等等。
此操作在函数式编程中也称为`foldl`(“向左折叠”)并且在那里流行。需要注意的是,它可能使代码难以理解。
此操作在函数式编程中也称为`foldl`(“向左折叠”),这种写法也非常的普遍。需要注意的是,它可能使代码难以理解。
`.reduce()`具有以下类型签名(在`Array<T>`内):
......@@ -907,7 +907,7 @@ const accumulator_2 = callback(accumulator_1, arr[2]);
// Etc.
```
`callback`将先前计算的摘要(存储在其参数`accumulator`中)与当前的 Array 元素组合,并返回下一个`accumulator``.reduce()`的结果是最终累加器 - `callback`的最后一个结果,在它访问了所有元素之后。
`callback`将先前计算的结果(存储在其参数`accumulator`中)与当前的 Array 元素组合,并返回下一个`accumulator``.reduce()`的结果是最终累加器 - `callback`的最后一个结果,在它访问了所有元素之后。
换句话说:`callback`完成大部分工作,`.reduce()`只是以有用的方式调用它。
......@@ -956,7 +956,7 @@ function addAll(arr) {
}
```
很难说这两个实现中的哪一个“更好”:基于`.reduce()`的实现更简洁,而基于`for-of`的实现可能更容易理解 - 特别是如果你不熟悉函数式编程
很难说这两个实现中的哪一个“更好”:基于`.reduce()`的实现更简洁,但如果你特别不熟悉函数式编程时,基于`for-of`的实现可能更容易理解
##### 28.10.7.2。示例:通过`.reduce()`查找索引
......@@ -1048,7 +1048,7 @@ sort(compareFunc?: (a: T, b: T) => number): this
正如您所看到的,所有非重音大写字母都出现在所有重音字母之前,这些字母位于所有重音字母之前。如果要对人类语言进行适当的排序,请使用`Intl`[JavaScript 国际化 API](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl)
最后,`.sort()`将 _ 排序到位 _:它改变并返回其接收器:
最后,`.sort()`将 _排序到位_:它改变并返回其接收器:
```js
> const arr = ['a', 'c', 'b'];
......@@ -1066,7 +1066,7 @@ true
* 如果`a === b`为零
* 如果`a > b`为正
记住这些规则的提示:负数是 _ 小于 _ 零(等)。
记住这些规则的提示:负数是 _小于_ 零(等)。
#### 28.11.2。排序数字
......@@ -1156,7 +1156,7 @@ assert.deepEqual(new Array(3), [,,,]);
* `Array.of<T>(...items: T[]): T[]` <sup>[ES6]</sup>
这个静态方法主要用于`Array`和 Typed Arrays 的子类,它用作自定义数组字面
这个静态方法主要用于`Array`和 Typed Arrays 的子类,它用作自定义数组字面
```js
assert.equal(
......@@ -1320,7 +1320,7 @@ assert.deepEqual(new Array(3), [,,,]);
* `.keys(): Iterable<number>` <sup>[R,ES6]</sup>
返回接收器的键上的可迭代
返回接收器上可迭代的键
```js
> [...['a', 'b'].keys()]
......@@ -1517,7 +1517,7 @@ assert.deepEqual(new Array(3), [,,,]);
* `.values(): Iterable<T>` <sup>[R,ES6]</sup>
返回接收器值的可迭代
返回接收器上可迭代的值
```js
> [...['a', 'b'].values()]
......@@ -1526,10 +1526,10 @@ assert.deepEqual(new Array(3), [,,,]);
#### 28.12.4。来源
* [TypeScript 的内置打字](https://github.com/Microsoft/TypeScript/blob/master/lib/)
* [TypeScript 的内置类型](https://github.com/Microsoft/TypeScript/blob/master/lib/)
* [适用于 JavaScript 的 MDN 网络文档](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
* [ECMAScript 语言规范](https://tc39.github.io/ecma262/)
![](img/bf533f04c482f83bfc407f318306f995.svg) **测验**
参见[测验应用程序](ch_quizzes-exercises.html#quizzes)
\ No newline at end of file
参见[测验应用程序](/docs/11.md#91测验)
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册