4
4
5
5
` Array.from ` 方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map)。
6
6
7
+ 下面是一个类似数组的对象,` Array.from ` 将它转为真正的数组。
8
+
7
9
``` javascript
8
10
let arrayLike = {
9
11
' 0' : ' a' ,
@@ -19,34 +21,41 @@ var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']
19
21
let arr2 = Array .from (arrayLike); // ['a', 'b', 'c']
20
22
```
21
23
22
- 下面是更多的例子 。
24
+ 实际应用中,常见的类似数组的对象是DOM操作返回的NodeList集合,以及函数内部的 ` arguments ` 对象。 ` Array.from ` 都可以将它们转为真正的数组 。
23
25
24
26
``` javascript
25
- Array .from (' hello' )
26
- // ['h', 'e', 'l', 'l', 'o']
27
-
28
- Array .from ([1 , 2 , 3 ])
29
- // [1, 2, 3]
30
-
31
- let namesSet = new Set ([' a' , ' b' ])
32
- Array .from (namesSet) // ['a', 'b']
33
-
27
+ // NodeList对象
34
28
let ps = document .querySelectorAll (' p' );
35
29
Array .from (ps).forEach (function (p ) {
36
30
console .log (p);
37
31
});
32
+
33
+ // arguments对象
34
+ function foo () {
35
+ var args = Array .from (arguments );
36
+ // ...
37
+ }
38
38
```
39
39
40
- 上面代码中,` querySelectorAll ` 方法返回的是一个类似数组的对象,只有将这个对象转为真正的数组,才能使用forEach方法 。
40
+ 上面代码中,` querySelectorAll ` 方法返回的是一个类似数组的对象,只有将这个对象转为真正的数组,才能使用 ` forEach ` 方法 。
41
41
42
- ` Array.from ` 方法可以将函数的 ` arguments ` 对象,转为数组 。
42
+ 只要是部署了Iterator接口的数据结构, ` Array.from ` 都能将其转为数组 。
43
43
44
44
``` javascript
45
- function foo () {
46
- var args = Array .from (arguments );
47
- }
45
+ Array .from (' hello' )
46
+ // ['h', 'e', 'l', 'l', 'o']
48
47
49
- foo (' a' , ' b' , ' c' );
48
+ let namesSet = new Set ([' a' , ' b' ])
49
+ Array .from (namesSet) // ['a', 'b']
50
+ ```
51
+
52
+ 上面代码中,字符串和Set结构都具有Iterator接口,因此可以被` Array.from ` 转为真正的数组。
53
+
54
+ 如果参数是一个真正的数组,` Array.from ` 会返回一个一模一样的新数组。
55
+
56
+ ``` javascript
57
+ Array .from ([1 , 2 , 3 ])
58
+ // [1, 2, 3]
50
59
```
51
60
52
61
值得提醒的是,扩展运算符(` ... ` )也可以将某些数据结构转为数组。
@@ -61,16 +70,14 @@ function foo() {
61
70
[... document .querySelectorAll (' div' )]
62
71
```
63
72
64
- 扩展运算符背后调用的是遍历器接口(` Symbol.iterator ` ),如果一个对象没有部署这个接口,就无法转换。` Array.from ` 方法就不存在这个问题,比如下面的这个例子,扩展运算符就无法转换。
65
-
66
- 所谓类似数组的对象,本质特征只有一点,即必须有` length ` 属性。因此,任何有` length ` 属性的对象,都可以通过` Array.from ` 方法转为数组。
73
+ 扩展运算符背后调用的是遍历器接口(` Symbol.iterator ` ),如果一个对象没有部署这个接口,就无法转换。` Array.from ` 方法则是还支持类似数组的对象。所谓类似数组的对象,本质特征只有一点,即必须有` length ` 属性。因此,任何有` length ` 属性的对象,都可以通过` Array.from ` 方法转为数组,而此时扩展运算符就无法转换。
67
74
68
75
``` javascript
69
76
Array .from ({ length: 3 });
70
77
// [ undefined, undefined, undefinded ]
71
78
```
72
79
73
- 上面代码中,` Array.from ` 返回了一个具有三个成员的数组,每个位置的值都是` undefined ` 。
80
+ 上面代码中,` Array.from ` 返回了一个具有三个成员的数组,每个位置的值都是` undefined ` 。扩展运算符转换不了这个对象。
74
81
75
82
对于还没有部署该方法的浏览器,可以用` Array.prototype.slice ` 方法替代。
76
83
@@ -80,7 +87,7 @@ const toArray = (() =>
80
87
)();
81
88
```
82
89
83
- ` Array.from ` 还可以接受第二个参数,作用类似于数组的` map ` 方法,用来对每个元素进行处理。
90
+ ` Array.from ` 还可以接受第二个参数,作用类似于数组的` map ` 方法,用来对每个元素进行处理,将处理后的值放入返回的数组 。
84
91
85
92
``` JavaScript
86
93
Array .from (arrayLike, x => x * x);
@@ -91,6 +98,18 @@ Array.from([1, 2, 3], (x) => x * x)
91
98
// [1, 4, 9]
92
99
```
93
100
101
+ 下面的例子是取出一组DOM节点的文本内容。
102
+
103
+ ``` javascript
104
+ let spans = document .querySelectorAll (' span.name' );
105
+
106
+ // map()
107
+ let names1 = Array .prototype .map .call (spans, s => s .textContent );
108
+
109
+ // Array.from()
110
+ let names2 = Array .from (spans, s => s .textContent )
111
+ ```
112
+
94
113
下面的例子将数组中布尔值为` false ` 的成员转为` 0 ` 。
95
114
96
115
``` javascript
@@ -110,7 +129,7 @@ typesOf(null, [], NaN)
110
129
111
130
如果` map ` 函数里面用到了` this ` 关键字,还可以传入` Array.from ` 的第三个参数,用来绑定` this ` 。
112
131
113
- ` Array.from() ` 可以将各种值转为真正的数组,并且还提供` map ` 功能。这实际上意味着,你可以在数组里造出任何想要的值 。
132
+ ` Array.from() ` 可以将各种值转为真正的数组,并且还提供` map ` 功能。这实际上意味着,只要有一个原始的数据结构,你就可以先对它的值进行处理,然后转成规范的数组结构,进而就可以使用数量众多的数组方法 。
114
133
115
134
``` javascript
116
135
Array .from ({ length: 2 }, () => ' jack' )
@@ -240,9 +259,9 @@ i32a.copyWithin(0, 2);
240
259
}) // 2
241
260
```
242
261
243
- 这两个方法都可以接受第二个参数,用来绑定回调函数的this对象 。
262
+ 这两个方法都可以接受第二个参数,用来绑定回调函数的 ` this ` 对象 。
244
263
245
- 另外,这两个方法都可以发现NaN,弥补了数组的IndexOf方法的不足 。
264
+ 另外,这两个方法都可以发现 ` NaN ` ,弥补了数组的 ` IndexOf ` 方法的不足 。
246
265
247
266
``` javascript
248
267
[NaN ].indexOf (NaN )
@@ -252,7 +271,7 @@ i32a.copyWithin(0, 2);
252
271
// 0
253
272
```
254
273
255
- 上面代码中,` indexOf ` 方法无法识别数组的NaN成员 ,但是` findIndex ` 方法可以借助` Object.is ` 方法做到。
274
+ 上面代码中,` indexOf ` 方法无法识别数组的 ` NaN ` 成员 ,但是` findIndex ` 方法可以借助` Object.is ` 方法做到。
256
275
257
276
## 数组实例的fill()
258
277
@@ -275,6 +294,8 @@ new Array(3).fill(7)
275
294
// ['a', 7, 'c']
276
295
```
277
296
297
+ 上面代码表示,` fill ` 方法从1号位开始,向原数组填充7,到2号位之前结束。
298
+
278
299
## 数组实例的entries(),keys()和values()
279
300
280
301
ES6提供三个新的方法——` entries() ` ,` keys() ` 和` values() ` ——用于遍历数组。它们都返回一个遍历器对象(详见《Iterator》一章),可以用` for...of ` 循环进行遍历,唯一的区别是` keys() ` 是对键名的遍历、` values() ` 是对键值的遍历,` entries() ` 是对键值对的遍历。
0 commit comments