Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
impatient-js-zh
提交
e1c7f9ee
I
impatient-js-zh
项目概览
OpenDocCN
/
impatient-js-zh
10 个月 前同步成功
通知
0
Star
266
Fork
38
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
I
impatient-js-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
e1c7f9ee
编写于
6月 17, 2019
作者:
飞
飞龙
提交者:
GitHub
6月 17, 2019
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #15 from 52admln/master
28.数组(Array)翻译完毕
上级
60b7fe52
ee65c0a4
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
42 addition
and
42 deletion
+42
-42
docs/35.md
docs/35.md
+42
-42
未找到文件。
docs/35.md
浏览文件 @
e1c7f9ee
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录