# ES6在企业中的应用
# 1.1 js的发展历史
# 1.2 TC39
推进 JavaScript 发展的委员会
- 会员都是公司
- 定期召开会议
- 会议由会员公司的代表与特邀专家出席 TC39 实行的是协商一致的原则:通过一项决议必须得到每一位会员(公司代表)的赞成
# 2. 新特性
# 2.1 模块化
- AMD -> require.js
- CMD -> sea.js
- commonjs
- UMD -> 兼容上面东西
ES6 来了,这个过时了。
# 2.1.1 模块特色
- 静态模块(模块变量不能是变量)
- 声明式语法
// 模块语法
import { $ } from 'jquery.js'; // es6
var $ = require('jquery.js')[$]; // amd
export { $ }; // es6
exports.$ = $; // amd
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 2.1.2 不一样的理念
- 按需引入 vs 全局引入
- 多点暴露 vs 全局暴露
// 模块思想
import { each } from 'underscore'; // es6 按需引入
var _ = require('underscore.js'); // amd 全局引入
export { each }; // es6 多点暴露
module.exports = _; // amd 全局暴露
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2.1.3 转码
浏览器目前还不支持 ES6 模块
- SystemJS
- transpiler(转换器),如 ES6 module transpiler, - babel, Traceur
- Webpack
# 2.1.4 为何 ES Module 姗姗来迟
# 2.2 字符串
// 字符串
`weisuoke ${abc}`; // es6
'weisuoke' + abc;
`weisuoke
.
com`; // es6
'weisuoke' +
'.' +
'com'; // es5
多行字符串
字符串插值(不能代替前端模板)
Unicode 的支持(node.js)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2.3 解构
- 数组解构
var arr = [1, 2, 3, 4];
var [first, second] = arr; // es6
var first = arr[0]; // es5
var second = arr[1]; // es5
1
2
3
4
5
2
3
4
5
- 对象解构
var obj = {a: 1, b: 2};
var {a, b} = obj; // es6
var a = obj.a; // es5
var b = obj.b; // es5
1
2
3
4
5
2
3
4
5
- 字符串解构
- 数值和布尔值的解构赋值
- 函数参数的解构赋值
function add([x, y]) {
return x + y;
}
add([1, 2]); // 3
1
2
3
4
5
2
3
4
5
# 2.4 对象
var a = 1;
var obj = {
a,
[a + 1]: 3,
add() {}
}; // es6
obj[a+1] = 3; // es5
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 2.5 数组 - Spread
var arr1 = [1, 2, 3];
var arr2 = [...arr1]; // es6 浅拷贝
var arr2 = [].concat(arr1); // es5
var arr2 = arr1.slice(0);
min(...arr2);
1
2
3
4
5
6
7
2
3
4
5
6
7
# 2.6 函数
- 箭头函数
[1, 2, 3].map(x => x + 1); // es6
[1, 2, 3].map(function(x) {
return x + 1;
}.bind(this)); // es5
1
2
3
4
5
2
3
4
5
- rest参数
// rest 参数
function aaa(...args) {
return args.join(',');
} // es6
function aaa() {
return [].slice.call(arguments, 0).join(',');
} // es5
function bbb(x, y, ...args) {
}
bbb(1, 2, ...[3, 4, 5]);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- 默认值
function b(a=1){
console.log(a)
}
b() //1
1
2
3
4
2
3
4
# 2.7 Class
- new构造函数
- 公有共享属性/方法
- 公有静态属性/方法
- 公有特权方法(访问私有成员)
- 公有成员
- 私有静态成员/方法
- 私有成员/方法
class Child extends Parent {
constructor() {
super();
this.value = 1;
}
get() {
return this.value;
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
function inherit(C, P) {
var F = function() {};
F.prototype = P.prototype;
C.prototype = new F(); // 临时构造函数
C.prototype.constructor = C; // 修复constructor
C.super = P; // 存储超类
}
function Student(age, num) {
Student.super.call(this. age);
this.num = num;
}
inherit(Student, People); // 继承父构造函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 2.8 Promise
思想的转变 es6promise
function async() {
return new Promise((resolve, reject) => {
window.setTimeout(() => { resolve(123); }, 1000)
})
}
await().then(function() {
// xxx
});
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 3. 其他新特性
generators
unicode
module loaders
map + set + weakmap + weakset
proxies
symbols
subclassable built-ins
math + number + string + array + object APIs
binary and octal literals
reflect api
tail calls
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 4. 无处不在的编译器
- masm
- gcc
- javac
- coffeescript/typescript
- less/sass
# 4.1 转换器
babel 原名:6to5 很优秀的编译器
- 如何使用
在线编译器
grunt、gulp、webpack
fis
1
2
3
2
3
- 兼容老代码
不能编译 .js
.es
.es.js
xxx.js
1
2
3
4
2
3
4
Traceur(Google)
# 5.fis
# 4.1 fis3 base
基于fis3的纯前端解决方案,拿来即用的fis3脚手架
# 5.5 未来 - 浏览器
- chrome firefox ie safari
- 每6周一个版本,(ie 4周)
- 无限演进 我们需要怎么做
- 我们指前端 FE
- babel
- 按需定制
- 按浏览器原生支持后下掉插件
# 6 为什么要学习 ES6
- 迟早要学(区别ts cs)
- 向标准靠拢(趋势)
- 可维护性(高)
- 学习成本(小)
- 编程激情(黑客)
- 我不要加班(效率)
- 面试中的加分项