Skip to content

Commit 180792d

Browse files
committed
修改array/comprehesion
1 parent 0a6ad94 commit 180792d

File tree

1 file changed

+27
-7
lines changed

1 file changed

+27
-7
lines changed

docs/array.md

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -145,14 +145,34 @@ ES6提供简洁写法,允许直接通过现有数组生成新数组,这被
145145
```javascript
146146

147147
var a1 = [1, 2, 3, 4];
148-
var a2 = [i * 2 for (i of a1)];
148+
var a2 = [for (i of a1) i * 2];
149149

150150
a2 // [2, 4, 6, 8]
151151

152152
```
153153

154154
上面代码表示,通过for...of结构,数组a2直接在a1的基础上生成。
155155

156+
注意,数组推导中,for...of结构总是写在最前面,返回的表达式写在最后面。
157+
158+
for...of后面还可以附加if语句,用来设定循环的限制条件。
159+
160+
```javascript
161+
162+
var years = [ 1954, 1974, 1990, 2006, 2010, 2014 ];
163+
164+
[for (year of years) if (year > 2000) year];
165+
// [ 2006, 2010, 2014 ]
166+
167+
[for (year of years) if (year > 2000) if(year < 2010) year];
168+
// [ 2006]
169+
170+
[for (year of years) if (year > 2000 && year < 2010) year];
171+
// [ 2006]
172+
173+
```
174+
上面代码表明,if语句写在for...of与返回的表达式之间,可以使用多个if语句。
175+
156176
数组推导可以替代map和filter方法。
157177

158178
```javascript
@@ -161,23 +181,23 @@ a2 // [2, 4, 6, 8]
161181
// 等价于
162182
[1, 2, 3].map(function (i) { return i * i });
163183

164-
[i for (i of [1,4,2,3,-8]) if (i < 3)];
184+
[for (i of [1,4,2,3,-8]) if (i < 3) i];
165185
// 等价于
166186
[1,4,2,3,-8].filter(function(i) { return i < 3 });
167187

168188
```
169189

170190
上面代码说明,模拟map功能只要单纯的for...of循环就行了,模拟filter功能除了for...of循环,还必须加上if语句。
171191

172-
新引入的for...of结构,可以直接跟在表达式的前面或后面,甚至可以在一个数组推导中,使用多个for...of结构。
192+
在一个数组推导中,还可以使用多个for...of结构,构成多重循环
173193

174194
```javascript
175195

176196
var a1 = ["x1", "y1"];
177197
var a2 = ["x2", "y2"];
178198
var a3 = ["x3", "y3"];
179199

180-
[(console.log(s + w + r)) for (s of a1) for (w of a2) for (r of a3)];
200+
[for (s of a1) for (w of a2) for (r of a3) console.log(s + w + r)];
181201
// x1x2x3
182202
// x1x2y3
183203
// x1y2x3
@@ -197,9 +217,9 @@ var a3 = ["x3", "y3"];
197217

198218
```javascript
199219

200-
[c for (c of 'abcde') if (/[aeiou]/.test(c))].join('') // 'ae'
220+
[for (c of 'abcde') if (/[aeiou]/.test(c)) c].join('') // 'ae'
201221

202-
[c+'0' for (c of 'abcde')].join('') // 'a0b0c0d0e0'
222+
[for (c of 'abcde') c+'0'].join('') // 'a0b0c0d0e0'
203223

204224
```
205225

@@ -211,4 +231,4 @@ var a3 = ["x3", "y3"];
211231

212232
这两个方法用于监听(取消监听)数组的变化,指定回调函数。
213233

214-
它们的用法与Object.observe和Object.unobserve方法完全一致,请参阅《对象的扩展》一章。唯一的区别是,对象可监听的变化一共有六种,而数组只有四种:add、update、delete、splice(数组的length属性发生变化)。
234+
它们的用法与Object.observe和Object.unobserve方法完全一致,也属于ES7的一部分,请参阅《对象的扩展》一章。唯一的区别是,对象可监听的变化一共有六种,而数组只有四种:add、update、delete、splice(数组的length属性发生变化)。

0 commit comments

Comments
 (0)