Skip to content

Commit caa4f9e

Browse files
committed
修改array
1 parent 0c99976 commit caa4f9e

File tree

4 files changed

+118
-2
lines changed

4 files changed

+118
-2
lines changed

docs/array.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,16 @@ Array.from({ 0: "a", 1: "b", 2: "c", length: 3 });
3737

3838
```
3939

40+
对于还没有部署该方法的浏览器,可以用Array.prototyp.slice方法替代。
41+
42+
```javascript
43+
44+
const toArray = (() =>
45+
Array.from ? Array.from : obj => [].slice.call(obj)
46+
)();
47+
48+
```
49+
4050
Array.from()还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理。
4151

4252
```JavaScript
@@ -170,6 +180,40 @@ for (let [index, elem] of ['a', 'b'].entries()) {
170180

171181
```
172182

183+
## 数组实例的includes()
184+
185+
Array.protypeto.includes方法返回一个布尔值,表示某个数组是否包含给定的值。该方法属于ES7。
186+
187+
```javascript
188+
189+
[1, 2, 3].includes(2); // true
190+
[1, 2, 3].includes(4); // false
191+
[1, 2, NaN].includes(NaN); // true
192+
193+
```
194+
195+
该方法的第二个参数表示搜索的起始位置,默认为0。
196+
197+
```javascript
198+
199+
[1, 2, 3].includes(3, 3); // false
200+
[1, 2, 3].includes(3, -1); // true
201+
202+
```
203+
204+
下面代码用来检查当前环境是否支持该方法,如果不支持,部署一个简易的替代版本。
205+
206+
```javascript
207+
208+
const contains = (() =>
209+
Array.prototype.includes
210+
? (arr, value) => arr.includes(value)
211+
: (arr, value) => arr.some(el => el === value)
212+
)();
213+
contains(["foo", "bar"], "baz"); // => false
214+
215+
```
216+
173217
## 数组推导
174218

175219
ES6提供简洁写法,允许直接通过现有数组生成新数组,这被称为数组推导(array comprehension)。

docs/function.md

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,22 @@ add(2, 5, 3) // 10
203203

204204
上面代码的add函数是一个求和函数,利用rest参数,可以向该函数传入任意数目的参数。
205205

206-
前面说过,rest参数中的变量代表一个数组,所以数组特有的方法都可以用于这个变量。下面是一个利用rest参数改写数组push方法的例子。
206+
下面是一个rest参数代替arguments变量的例子。
207+
208+
```javascript
209+
210+
// arguments变量的写法
211+
const sortNumbers = () =>
212+
Array.prototype.slice.call(arguments).sort();
213+
214+
// rest参数的写法
215+
const sortNumbers = (...numbers) => numbers.sort();
216+
217+
```
218+
219+
上面代码的两种写法,比较后可以发现,rest参数的写法更自然也更简洁。
220+
221+
rest参数中的变量代表一个数组,所以数组特有的方法都可以用于这个变量。下面是一个利用rest参数改写数组push方法的例子。
207222

208223
```javascript
209224

@@ -510,6 +525,17 @@ var getTempItem = id => ({ id: id, name: "Temp" });
510525

511526
```
512527

528+
箭头函数使得表达更加简洁。
529+
530+
```javascript
531+
532+
const isEven = n => n % 2 == 0;
533+
const square = n => n * n;
534+
535+
```
536+
537+
上面代码只用了两行,就定义了两个简单的工具函数。如果不用箭头函数,可能就要占用多行,而且还不如现在这样写醒目。
538+
513539
箭头函数的一个用处是简化回调函数。
514540

515541
```javascript
@@ -585,3 +611,31 @@ var handler = {
585611
由于this在箭头函数中被绑定,所以不能用call()、apply()、bind()这些方法去改变this的指向。
586612

587613
长期以来,JavaScript语言的this对象一直是一个令人头痛的问题,在对象方法中使用this,必须非常小心。箭头函数绑定this,很大程度上解决了这个困扰。
614+
615+
箭头函数内部,还可以再使用箭头函数。下面是一个部署管道机制(pipeline)的例子。
616+
617+
```javascript
618+
619+
const pipeline = (...funcs) =>
620+
val => funcs.reduce((a, b) => b(a), val);
621+
622+
const plus1 = a => a + 1;
623+
const mult2 = a => a * 2;
624+
const addThenMult = pipeline(plus1, mult2);
625+
626+
addThenMult(5)
627+
// 12
628+
629+
```
630+
631+
上面的代码等同于下面的写法。
632+
633+
```javascript
634+
635+
const plus1 = a => a + 1;
636+
const mult2 = a => a * 2;
637+
638+
mult2(plus1(5))
639+
// 12
640+
641+
```

docs/object.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,23 @@ function clone(origin) {
271271

272272
```
273273

274-
**(4)为属性指定默认值**
274+
**(4)合并多个对象**
275+
276+
将多个对象合并到某个对象。
277+
278+
```javascript
279+
const merge =
280+
(target, ...sources) => Object.assign(target, ...sources);
281+
```
282+
283+
如果希望合并后返回一个新对象,可以改写上面函数,对一个空对象合并。
284+
285+
```javascript
286+
const merge =
287+
(...sources) => Object.assign({}, ...sources);
288+
```
289+
290+
**(5)为属性指定默认值**
275291

276292
```javascript
277293

docs/reference.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
- Axel Rauschmayer, [ECMAScript 6: what’s next for JavaScript?](https://speakerdeck.com/rauschma/ecmascript-6-whats-next-for-javascript-august-2014): 关于ES6新增语法的综合介绍,有很多例子
2222
- Toby Ho, [ES6 in io.js](http://davidwalsh.name/es6-io)
2323
- Guillermo Rauch, [ECMAScript 6](http://rauchg.com/2015/ecmascript-6/)
24+
- Charles King, [The power of ECMAScript 6](http://charlesbking.com/power_of_es6/#/)
25+
- Benjamin De Cock, [Frontend Guidelines](https://github.com/bendc/frontend-guidelines): ES6最佳实践
2426

2527
## 语法点
2628

0 commit comments

Comments
 (0)