ES6语法分享

luohy15

2019-05-20

module

  • export, import
  • 取代之前的require和module.exports
  • 从运行时加载变为编译时加载
  • 能够进行静态分析优化

module: 常用语法

// in xxx.js
export let m = 1
// export {m}

// in yyy.js
import {m} from './xxx'
// import {m} from './xxx'
// import {m as n} from './xxx'

module: export default

// in xxx.js
// export let m = 1
let m = 1
// export {m}
export default m

// in yyy.js
// import {m} from './xxx'
// import {m} from './xxx'
// import {m as n} from './xxx'
// import * as x from './xxx'
import n from './xxx'

本质上输出一个叫default的变量, 然后允许你命名

module: 其它

  • import(): 条件/动态加载
  • 复合写法: export {foo as myFoo} from 'xxx'

const

  • 变量指向的内存地址不变
  • 原始类型 (number, string, boolean) 值就存储在那个内存地址
  • 复合类型 (Object, Array) 那个内存地址存的是指针

let vs var

  • 块级作用域 vs 全局作用域
    • 块级作用域不会污染外层变量
  • 不存在变量提升 vs 变量提升
  • 存在暂时性死区 vs 无暂时性死区
  • 不允许重复声明 vs 允许重复声明

object: 简洁表示法

const foo = 'bar';
const baz = {foo};
baz // {foo: "bar"}

const o = {
  method() {
    return "Hello!";
  }
};
o // {method: f}


// 属性名为变量名, 属性值为变量的值

// 多用于返回值/接口的简写

object: 拓展运算符

let a = {k1: 0}
let b = {...a, k2: 0} // { k1: 0, k2: 0 }

// 常和map结合使用

object: 解构赋值

let a = {k1: 0}
let b = {...a, k2: 0} // { k1: 0, k2: 0 }
let {k2, ...c} = b 
c // {k1 : 0}

array: 常用操作

b = a.map((item, idx, arr) => item + 1, out)
// map是可以有idx的
// 可以接受第二个变量作为this

a.reduce((acc, cur, idx, arr) => acc + cur, init)
// 还有从后往前的reduceRight
// init作为累积变量初始值
// 实际上reduce也可以用来做遍历

箭头函数

let fa = v => v
fa(1) // 1

let getObj = id => ({id: id})
getObj(1) // {id: 1}

function foo() {
  return () => {
    return () => {
      return () => {
        console.log('id:', this.id);
      };
    };
  };
}
let f = foo.call({id: 1});
// 箭头函数没有自己的this
f.call({id: 2})()(); // id: 1
f().call({id: 3})(); // id: 1
f()().call({id: 4}); // id: 1

箭头函数+解构赋值+简洁表示法

const object = { a: 5, b: 6, c: 7  };
const picked = (({ a, c }) => ({ a, c }))(object);
picked // ???
picked // { a: 5, c: 7 }
const object = { a: 5, b: 6, c: 7  };
const picked = (({ a, c }) => ({ a, c }))(object);
picked // ???

模板字符串

// 告别 para = 'k1=' + v1 + '&k2=' + v2 + ...
para = `k1=${v1}&k2=${v2}`

异步操作模式

  • 回调函数
  • 事件监听 
  • 观察者模式

Promise: 为异步操作提供同步接口

// 传统写法
step1(function (value1) {
  step2(value1, function(value2) {
    step3(value2, function(value3) {
      step4(value3, function(value4) {
        // ...
      });
    });
  });
});

// Promise 的写法
(new Promise(step1))
  .then(step2)
  .then(step3)
  .then(step4);

Promise: 微任务

setTimeout(function() {
  console.log(1);
}, 0);

new Promise(function (resolve, reject) {
  resolve(2);
}).then(console.log);

console.log(3);
// 3
// 2
// 1

// 在本轮事件循环末尾执行
// 晚于同步任务
// 早于一般异步任务

Promise & Generator

var g = function* (){
  var f1 = yield readFileThunk('fileA');
  var f2 = yield readFileThunk('fileB');
  // ...
  var fn = yield readFileThunk('fileN');
};

run(g);

Async

const sleep = (milliseconds) => {
  return new Promise(resolve => setTimeout(resolve, milliseconds))
}

async function basicDemo() {
  let result = await sleep(3000);
  console.log('a')
}

basicDemo();