ES6
ECMAScript
语言与平台之间的关系是什么?
JavaScript(web) = ECMAScript + Web APIs(BOM + DOM)
JavaScript(node) = ECMAScript + Node APIs(fs + net + etc.)
ES2015
2015 年发布的 JS 第 6 个版本,也叫 ES6。
解决原有语法的不足。增强原有语法。
语法增强
- let、const
- 解构,数组解构和对象解构
- 模板字符串,带标签的模板字符串
- 字符串扩展方法
- 函数参数默认值
- 扩展运算符(...),收集剩余数据,展开数据
- 箭头函数
- 对象扩展方法
- proxy 和 defineProperty
- Reflect 对象
- Promise
- class
- Set 和 Map 数据结构
- Symbol,为对象添加独一无二的属性名
- for...of 遍历任意数据结构,需要有 iterator;对象可先使用 entries 方法转成数组。
- Iterable 接口,迭代器 Symbol.iterator
- 迭代器接口,迭代器模式
- Generator 函数与使用场景
- ES Modules
异步编程
不要在forEach
中使用异步。像并发,js 是单线程语言只有并发,短时间内执行很多任务。只有多线程或多进程的程序才有并行。
js 使用 EventLoop 机制,用宏任务和微任务实现并发。
for...in 和 for...of
for...in
:es5 方法,使用在对象上,等同于Object.keys()
for...of
:es6 方法使用在数组上
如果再循环中有复杂的逻辑,建议将逻辑封装成一个函数。
如果里面有异步操作,建议使用for...of
,代替forEach
,因为forEach
不会等待异步执行。
Promise
Promise执行多个异步方法
使用这种方式,可以非常快捷方便的执行很多个异步方法
let runner = new Promise((resolve, reject) => {
let chain = Promise.resolve()
chain = chain.then(() => checkNodeVersion())
chain = chain.then(() => initArgs())
chain = chain.then(() => init())
chain = chain.then(() => exec())
chain.catch((error) => log.error(error.message))
})
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
Promise - catch 异常
每一层异步处理都需要有一层try catch
。
全局的try catch
可以捕获全局调用栈中的异常,如果在异步里面嵌套Promise
执行,需要在里面再做catch
处理。