ES6标准发布后,前端人员也开发渐渐了解到了es6,可是因为兼容性的问题,仍然没有获得普遍的推广,不过业界也用了一些折中性的方案来解决兼容性和开发体系问题,但你们仍很疑惑,使用ES6会有哪些兼容性问题。javascript
以前写了es6经过Babel编译后的在浏览器端的兼容性问题《Babel下的ES6兼容性和规范》,随着范围的扩展,ES6在Nodejs上兼容性也有必要从新梳理下。 随着iojs的引入,新版的Nodejs开始原生支持部分ES6的特性,既然ES6在浏览器端使用须要使用babel等编译,在Nodejs总能够放心使用了吧。然而事实并不是如此,为此在nodejs端,我也作了特性兼容性研究:html
ES6新特性在Nodejs下的兼容性列表 这里罗列下nodejs支持的新特性,没列出的新特性均为不支持。前端
https://iojs.org/en/es6.html https://kangax.github.io/compat-table/es6/java
ES6特性 | Nodejs兼容性 |
---|---|
let,const,块 | strict模式支持 |
class类 | strict模式支持 |
Map,Set 和 WeakMap,WeakSet | 支持 |
generators | 支持 |
进制转换 | 支持 |
对象字面量扩展 | 支持 |
promise | 支持 |
String对象新API | 支持 |
symbols | 支持 |
字符串模板 | 支持 |
可见,es6的新特性在Nodejs中比babel还要差,而新版的babel已经可以支持es6的90%新特性了~node
尽管目前Node下使用ES6咱们仍然会大失所望,但es6发展的趋势定是必然,这里仍是有必要对ES6的原生性能作了详细的对比测试。测试基本方法:git
1,对于重复操做循环执行100万次 2,全部程序运行在Nodejs下执行 3,环境描述es6
2.一、let, const, 块github
'use strict' let i = 0; let t1 = +new Date(), t2; while(i++ < 1000000){ const a = 1; const b = '1'; const c = true; const d = {}; const e = []; } t2 = +new Date() - t1; console.log(t2);
运行次数 | ES5运行时间 | ES6运行时间 |
---|---|---|
100万 | 52-53ms | 33-34ms |
结果让我震惊了,使用let,const声明变量的速度居然比var快了约65%左右。缘由多是使用var会去检查做用域上的同名变量,而使用let或const不用考虑。promise
2.二、class类使用浏览器
'use strict' let i = 0; let t1 = +new Date(), t2; while(i++ < 100000){ class A{ constructor() { this.name = 'ouven'; } getName(){ return this.name; } } const a = new A(); a.getName(); } t2 = +new Date() - t1; console.log(t2);
运行次数 | ES5运行时间 | ES6运行时间 |
---|---|---|
10万 | 1179-1211ms | 1411-1442ms |
可见使用Nodejs的Class比ES的function构造方法慢约25%
2.三、Map,Set 和 WeakMap,WeakSet
'use strict' let i = 0; let t1 = +new Date(), t2; while(i++ < 1000000){ let map = new Map(); map.set('key','value'); } t2 = +new Date() - t1; console.log(t2);
运行次数 | ES5运行时间 | ES6运行时间 |
---|---|---|
100万 | 11-13ms | 179-180ms |
测试结果看,Map的效率相对普通的对象key-value的结果相比慢的多,可是Map的Key可使负责类型,这里的参考性也就不是绝对准确。建议是不到必须状况,不要使用Map等复杂类型。Set、WeakMap、WeakSet均相对object结构执行效率慢得多。
2.四、字符串模板
'use strict' let i = 0; let t1 = +new Date(), t2; let vars = { name: 'ouven', address: 'tencent' }; while(i++ < 1000000){ let str = `string text ${vars.name} string ${vars.address}`; } t2 = +new Date() - t1; console.log(t2);
运行次数 | ES5运行时间 | ES6运行时间 |
---|---|---|
100万 | 8ms | 59-61ms |
ES6的字符串模板看起来很好,可是因为执行时必须扫描这个串,找出里面的模板变量,因此总体上性能就相对ES5的字符串拼接慢了不少。
其它的特性实现有兴趣的同窗能够本身继续研究。相信结果大概能够预测到。
这里选择了ES6中的少数特性和ES5的实现的执行效率作了对比,总体上说,ES6的新特性相对ES5的实现效率慢些,而有些特性固然是ES5没法实现的。因此在了解使用ES6的同时,除了了解它的新特性和优势,对于ES6自己的一些问题也要作到心中有数。固然,随着ES6的完善和Node的更新,相信这些也不会是大的问题,并且这些也不会影响ES6的发展。
https://github.com/ouvens/ecmaScript-2015-babel-rules
原文连接:https://ouvens.github.io/frontend-javascript/2015/12/06/es6-in-nodejs.html