From caa4f9e99372d3b87e34dacc99638ed628ae1a0e Mon Sep 17 00:00:00 2001 From: Ruan Yifeng Date: Thu, 26 Feb 2015 01:09:05 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9array?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/array.md | 44 +++++++++++++++++++++++++++++++++++++ docs/function.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++- docs/object.md | 18 ++++++++++++++- docs/reference.md | 2 ++ 4 files changed, 118 insertions(+), 2 deletions(-) diff --git a/docs/array.md b/docs/array.md index fcb92a2..770bf1d 100644 --- a/docs/array.md +++ b/docs/array.md @@ -37,6 +37,16 @@ Array.from({ 0: "a", 1: "b", 2: "c", length: 3 }); ``` +对于还没有部署该方法的浏览器,可以用Array.prototyp.slice方法替代。 + +```javascript + +const toArray = (() => + Array.from ? Array.from : obj => [].slice.call(obj) +)(); + +``` + Array.from()还可以接受第二个参数,作用类似于数组的map方法,用来对每个元素进行处理。 ```JavaScript @@ -170,6 +180,40 @@ for (let [index, elem] of ['a', 'b'].entries()) { ``` +## 数组实例的includes() + +Array.protypeto.includes方法返回一个布尔值,表示某个数组是否包含给定的值。该方法属于ES7。 + +```javascript + +[1, 2, 3].includes(2); // true +[1, 2, 3].includes(4); // false +[1, 2, NaN].includes(NaN); // true + +``` + +该方法的第二个参数表示搜索的起始位置,默认为0。 + +```javascript + +[1, 2, 3].includes(3, 3); // false +[1, 2, 3].includes(3, -1); // true + +``` + +下面代码用来检查当前环境是否支持该方法,如果不支持,部署一个简易的替代版本。 + +```javascript + +const contains = (() => + Array.prototype.includes + ? (arr, value) => arr.includes(value) + : (arr, value) => arr.some(el => el === value) +)(); +contains(["foo", "bar"], "baz"); // => false + +``` + ## 数组推导 ES6提供简洁写法,允许直接通过现有数组生成新数组,这被称为数组推导(array comprehension)。 diff --git a/docs/function.md b/docs/function.md index 1632c0f..4e97044 100644 --- a/docs/function.md +++ b/docs/function.md @@ -203,7 +203,22 @@ add(2, 5, 3) // 10 上面代码的add函数是一个求和函数,利用rest参数,可以向该函数传入任意数目的参数。 -前面说过,rest参数中的变量代表一个数组,所以数组特有的方法都可以用于这个变量。下面是一个利用rest参数改写数组push方法的例子。 +下面是一个rest参数代替arguments变量的例子。 + +```javascript + +// arguments变量的写法 +const sortNumbers = () => + Array.prototype.slice.call(arguments).sort(); + +// rest参数的写法 +const sortNumbers = (...numbers) => numbers.sort(); + +``` + +上面代码的两种写法,比较后可以发现,rest参数的写法更自然也更简洁。 + +rest参数中的变量代表一个数组,所以数组特有的方法都可以用于这个变量。下面是一个利用rest参数改写数组push方法的例子。 ```javascript @@ -510,6 +525,17 @@ var getTempItem = id => ({ id: id, name: "Temp" }); ``` +箭头函数使得表达更加简洁。 + +```javascript + +const isEven = n => n % 2 == 0; +const square = n => n * n; + +``` + +上面代码只用了两行,就定义了两个简单的工具函数。如果不用箭头函数,可能就要占用多行,而且还不如现在这样写醒目。 + 箭头函数的一个用处是简化回调函数。 ```javascript @@ -585,3 +611,31 @@ var handler = { 由于this在箭头函数中被绑定,所以不能用call()、apply()、bind()这些方法去改变this的指向。 长期以来,JavaScript语言的this对象一直是一个令人头痛的问题,在对象方法中使用this,必须非常小心。箭头函数绑定this,很大程度上解决了这个困扰。 + +箭头函数内部,还可以再使用箭头函数。下面是一个部署管道机制(pipeline)的例子。 + +```javascript + +const pipeline = (...funcs) => + val => funcs.reduce((a, b) => b(a), val); + +const plus1 = a => a + 1; +const mult2 = a => a * 2; +const addThenMult = pipeline(plus1, mult2); + +addThenMult(5) +// 12 + +``` + +上面的代码等同于下面的写法。 + +```javascript + +const plus1 = a => a + 1; +const mult2 = a => a * 2; + +mult2(plus1(5)) +// 12 + +``` diff --git a/docs/object.md b/docs/object.md index f267bb0..81e89a1 100644 --- a/docs/object.md +++ b/docs/object.md @@ -271,7 +271,23 @@ function clone(origin) { ``` -**(4)为属性指定默认值** +**(4)合并多个对象** + +将多个对象合并到某个对象。 + +```javascript +const merge = + (target, ...sources) => Object.assign(target, ...sources); +``` + +如果希望合并后返回一个新对象,可以改写上面函数,对一个空对象合并。 + +```javascript +const merge = + (...sources) => Object.assign({}, ...sources); +``` + +**(5)为属性指定默认值** ```javascript diff --git a/docs/reference.md b/docs/reference.md index ac069ee..b0c364c 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -21,6 +21,8 @@ - Axel Rauschmayer, [ECMAScript 6: what’s next for JavaScript?](https://speakerdeck.com/rauschma/ecmascript-6-whats-next-for-javascript-august-2014): 关于ES6新增语法的综合介绍,有很多例子 - Toby Ho, [ES6 in io.js](http://davidwalsh.name/es6-io) - Guillermo Rauch, [ECMAScript 6](http://rauchg.com/2015/ecmascript-6/) +- Charles King, [The power of ECMAScript 6](http://charlesbking.com/power_of_es6/#/) +- Benjamin De Cock, [Frontend Guidelines](https://github.com/bendc/frontend-guidelines): ES6最佳实践 ## 语法点