Nodejs下的ES6兼容性與性能分析

ES6標準發佈後,前端人員也開發漸漸瞭解到了es6,可是因爲兼容性的問題,仍然沒有獲得普遍的推廣,不過業界也用了一些折中性的方案來解決兼容性和開發體系問題,但你們仍很疑惑,使用ES6會有哪些兼容性問題。javascript

1、Nodejs下ES6兼容性現狀

  以前寫了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

2、Nodejs ES6性能分析

  儘管目前Node下使用ES6咱們仍然會大失所望,但es6發展的趨勢定是必然,這裏仍是有必要對ES6的原生性能作了詳細的對比測試。測試基本方法:git

1,對於重複操做循環執行100萬次 2,全部程序運行在Nodejs下執行 3,環境描述es6

  • CPU: Interl(R) Core(Tm) i5-3470 CPU @ 3.2GHz
  • 內存:4.00GB
  • 操做系統: 64位操做系統
  • node版本:node v5.1.1

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的字符串拼接慢了不少。

其它的特性實現有興趣的同窗能夠本身繼續研究。相信結果大概能夠預測到。

測試用例代碼地址

3、小結

  這裏選擇了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

相關文章
相關標籤/搜索