1、解构赋值

1.1、定义

什么是解构赋值?
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。这种赋值语法极度简洁,同时还比传统的属性访问方法更为清晰。
其中包括:数组,对象的解构赋值,字符串的解构赋值,函数参数的解构赋值

1.2、数组解构

  1. let test=[1,2,3];
  2. //es5
  3. let first = test[0];
  4. let second = test[1];
  5. let third = test[2];
  6. //es6
  7. let [first, , third] = test
  8. //fist//1
  9. //second//undefined

1.3、对象解构

  1. let obj={ foo: "a", bar: "b" };
  2. //es5
  3. let foo= obj.foo;
  4. let bar= obj.bar;
  5. //es6
  6. let { foo, bar } = obj;
  7. //foo // "a"
  8. //bar // "b"

1.4、字符解构

  1. const [a, b, c, d, e] = 'hello';
  2. console.log("d:", d);//l
  3. let { length } = "string";
  4. console.log("length:", length);//6

1.5、函数解构

  1. //es5
  2. var arr = [1, 2];
  3. function test(a, b) {
  4. console.log("a:" + a);//1
  5. console.log("b:" + b);//2
  6. }
  7. test(arr[0], arr[1]);
  8. //es6
  9. var arr1 = [11, 22];
  10. function test1([a, b]) {
  11. console.log("a:" + a);//11
  12. console.log("b:" + b);//22
  13. }
  14. test1(arr1);
  15. var obj = { b: 33, a: 44 };
  16. function test2({ a, b }) {
  17. console.log("a:" + a);//33
  18. console.log("b:" + b);//44
  19. }
  20. test2(obj);
  21. //用法:
  22. let { floor, pow } = Math;
  23. console.log("a" + pow(3, 3));//9
  24. // 引入库
  25. const {toNumber,trim} = require('lodash');

2、运算符(…)

2.1、定义

(…)用于把一个数组转化为用逗号分隔的参数序列,它常用在不定参数个数时的函数调用,数组合并,替代es5的apply方法,与解构赋值结合,生成新数组等情形。

2.2、可变参数个数的函数调用

  1. function add(...vals) {
  2. let sum = 0;
  3. for (let i = 0; i < vals.length; i++) {
  4. sum += vals[i];
  5. }
  6. return sum;
  7. }
  8. let test = [1, 2, 3, 4, 5];
  9. let sum = add(...test);//15

2.3、便捷的数组合并

  1. let arr1 = [1,2];
  2. let arr2 = [5,6];
  3. let newArr = [20];
  4. //es5
  5. newArr = newArr.concat(arr1).concat(arr2); //[20,1,2,5,6]
  6. //es6
  7. newArr = [20,...arr1,...arr2]; //[20,1,2,5,6]

2.4、替代es5的apply方法

  1. //ES5
  2. function f(x, y, z) {}
  3. var args = [0, 1, 2];
  4. f.apply(null, args);
  5. // ES6
  6. let args = [0, 1, 2];
  7. f(...args);
  8. //ES5
  9. Math.max.apply(null, [14, 3, 77])
  10. // ES6
  11. Math.max(...[14, 3, 77])
  12. //等同于Math.max(14, 3, 77);

2.5、与解构赋值结合,生成新数组

  1. const [first, ...rest] = [1, 2, 3];
  2. //first // 1
  3. //rest // [2, 3]

3、箭头函数

3.1、定义

es6使用“箭头”(=>)定义函数。
箭头函数(arrow function),使用的频率非常的高,写法也是非常的简洁和清晰!

3.2、简化回调函数

  1. [1,2,3].map(function (x) {
  2. return x * x;
  3. });
  4. // es6
  5. [1,2,3].map(x => x * x);
  6. const test = (head, ...tail) => [head, tail];
  7. test(1, 2, 3, 4, 5)// [1,[2,3,4,5]]
  8. //箭头函数取代Function.prototype.bind,不应再用self/_this/that绑定 this
  9. //es5
  10. const self = this;
  11. const boundMethod = function(...params) {
  12. return method.apply(self, params);
  13. }
  14. // es6
  15. const boundMethod = (...params) => method.apply(this, params);

4、箭头函数

4.1、定义

模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量,可多重嵌套。

4.2、简化回调函数

  1. //es5
  2. let title = "hello world!"
  3. var tpl = '<div>' +
  4. '<span>' + title + '</span>' +
  5. '</div>';
  6. //es6
  7. let tpl2 = `<div>
  8. <span>${title}</span>
  9. </div>`;
  10. let tpl3 = `<div>
  11. <span>${title+`
  12. <span>${title} 2016</span>
  13. `}</span>
  14. </div>`;

5、export, import

5.1、定义

使用import取代require。
使用export取代module.exports。

5.2、简化回调函数

  1. //es5
  2. const moduleA = require('moduleA');
  3. const func1 = moduleA.func1;
  4. const func2 = moduleA.func2;
  5. // es6
  6. import { func1, func2 } from 'moduleA'; //对象解构
  7. // commonJS的写法
  8. const commons = {
  9. SUCCESS: '请求成功',
  10. FAILED: '请求失败'
  11. }
  12. module.exports = commons;
  13. // ES6的写法
  14. const commons = {
  15. SUCCESS: '请求成功',
  16. FAILED: '请求失败'
  17. }
  18. export commons

6、for … of

6.1、定义

for…of循环,可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、Generator 对象,以及字符串。

6.2、遍历数组

  1. const arr = ['red', 'green', 'blue'];
  2. for (let v of arr) {
  3. console.log(v); // red green blue
  4. }
  5. // 对比for-in和for-of:
  6. for (var k in arr) {
  7. console.log(k);
  8. } // 0 1 2
  9. var engines = new Set(["Gecko", "Webkit", "Webkit"]);
  10. for (var e of engines) {
  11. console.log(e);
  12. }
  13. // Gecko
  14. // Webkit
  15. var es6 = new Map();
  16. es6.set("edition", 6);
  17. es6.set("standard", "ECMA-262");
  18. for (var [name, value] of es6) {
  19. console.log(name + ": " + value);
  20. }
  21. //edition: 6
  22. //standard: ECMA-262

6.3、遍历Set 和 Map 结构

  1. let map = new Map().set('a', 1).set('b', 2);
  2. for (let pair of map) {
  3. console.log(pair);
  4. }
  5. // ['a', 1]
  6. // ['b', 2]
  7. for (let [key, value] of map) { //数组解构
  8. console.log(key + ' : ' + value);
  9. }
  10. //a : 1
  11. //b : 2

7、es6代码片段示例:

  1. const moment = require('moment');
  2. const { pathConfig } = require('../config');
  3. const formatDate = (date) => {
  4. return moment(date).format('YYYY-MM-DD HH:mm');
  5. };
  6. const getPath = (picture) => {
  7. const pathParse = path.parse(picture.path);
  8. return `${pathConfig.PIC_DIR}${pathParse.dir}/${picture.name}_${pathParse.ext}`;
  9. };
  10. const assignPicture = (picture) => {
  11. const plain = picture.get({ plain: true});
  12. const path = getPath(plain);
  13. return assignIn(plain, {
  14. path: path,
  15. created_at: formatDate(picture.created_at),
  16. });
  17. };
  18. const getResult = (pictureRs) => {
  19. const assignedResultRows = pictureRs.rows.map(assignPicture);
  20. return {
  21. count: pictureRs.count,
  22. rows: assignedResultRows,
  23. };
  24. };

8、小结

以上是平时用得比较多的内容,这些语法、新增类型、模块调用等从代码量上、可读性上、操作上给项目带来了不少便利。
随着es6的普及,这些高级语言的特性让写js也越来越顺畅。

9、参考资料

1.ECMAScript 6 入门http://es6.ruanyifeng.com/

  1. ES6 扩展运算符 三个点(…)
    http://www.jianshu.com/p/86cbabeda999

  2. es6的常用语法和优越性https://juejin.im/post/5a08e5c55188252abc5dd96f#heading-2

  3. ES6的一些常用特性
    https://www.cnblogs.com/MuYunyun/p/6235325.html#_label6