node中使用es6/7/8(支持性与性能)


Posted in Javascript onMarch 28, 2019

前言

这几年react、vue的快速发展,越来越多的前端开始讲es6的代码运用在项目中,因为我们可以通过babel进行转译为低版本的js以便于运行在所有浏览器中,import、export、let、箭头函数等等,对于node端,当然我们也希望使用这些高级语法,但是需要提前了解到node支持哪些新的语法。

分类

所有的es6特性被分成了三个阶段/分类:

  • shipping --- v8引擎可以支持的很好,默认情况下我们是不需要设立任何的flag而可以直接运行的。
  • staged --- 这些是将要完成的新特性但是还不能被v8引擎所支持,需要使用 runtime flag: --harmony。
  • in progress --- 这些特性是最好不要使用的,因为很有可能未来会被废弃,具有不确定性。

那么那些特性是nodejs版本默认支持的呢?

node中使用es6/7/8(支持性与性能)

可以看到,我们常用的一些es6语法,node的支持已经很好了,因为当前node的最新版本已经是 6.11.2 了,这是推荐使用的版本,而最新的版本已经达到了8.3.0 。

所以我们在node端写es6语法时,大部分是可以直接使用的。但是对于es7/8的特性,目前还不能很好的支持。

哪些特性是在开发中呢?

新的特性在不断地添加到v8引擎中去, 一般的说, 还是期待他们到最新的v8引擎中的,尽管不知道是什么时候。

你可以通过grepping来列出所有的in progress的特性,即使用 --v8-options 参数。 值得注意的是, 这些还是兼容性不好的特性,所有需要谨慎的使用他们。

性能 

es6是大势所趋,我们不仅需要了解其特性的兼容性,还要早性能上做到心中有数,下面我们可以对es5和es6在node上跑来比较时间。

块级作用域

es5测试:

var i = 0;
var start = +new Date(),
 duration;

while (i++ < 1000000000) {
 var a = 1;
 var b = '2';
 var c = true;
 var d = {};
 var e = [];
}

duration = +new Date() - start;
console.log(duration)

多次测试,耗时分别为 11972/11736/11798

es6测试:

let i = 0;
let start = +new Date(),
 duration;

while (i++ < 1000000000) {
 const a = 1;
 const b = '2';
 const c = true;
 const d = {};
 const e = [];
}

duration = +new Date() - start;
console.log(duration)

经过多次测试, 耗时分别为 11583/11674/11521。

在这一方面使用es6语法略快。

class

es5语法

var i = 0;
var start = +new Date(),
 duration;

function Foo() {;
 this.name = 'wayne'
}

Foo.prototype.getName = function () {
 return this.name;
}

var foo = {};

while (i++ < 10000000) {
 foo[i] = new Foo();
 foo[i].getName();
}

duration = +new Date() - start;

console.log(duration)

经过测试,耗时分别为 2030/2062/1919ms。

es6语法:

注意: 因为我们这里只是测试class,所以两者都是用var来声明变量,即单一变量原则。

var i = 0;
var start = +new Date(),
 duration;
 
class Foo {
 constructor() {
  this.name = 'wayne'  
 }
 getName () {
  return this.name;
 }
}


var foo = {};

while (i++ < 10000000) {
 foo[i] = new Foo();
 foo[i].getName();
}

duration = +new Date() - start;

console.log(duration)

经过三轮测试,结果分别是 2044/2129/2080, 由此可见,两者在速度上几乎是没有区别的

4.x的node版本在运行es6代码相比于es5代码是非常慢的,但是现在使用node的6.11.2版本来运行es6代码和运行es5代码相比,两者是一样快的,可见node对于新特性的运行速度得到了极大地改善。

map

es5语法:

var i = 0;
var start = +new Date(),
 duration;

while (i++ < 100000000) {
 var map = {};
 map['key'] = 'value'
}

duration = +new Date() - start;
console.log(duration)

运行5次,结果分别为: 993/858/897/855/862

es6语法:

var i = 0;
var start = +new Date(),
 duration;

while (i++ < 100000000) {
 var map = new Map();
 map.set('key', 'value');
}

duration = +new Date() - start;
console.log(duration)

经过几轮测试,耗时分别为: 10458/10316/10319。 即es6的Map在运行时间上是es5的10倍以上,所以在node环境下我们最好少使用Map语法。

模板字符串

es5语法:

var i = 0;
var start = +new Date(),
 duration;

var person = {
 name: 'wayne',
 age: 21,
 school: 'xjtu'
}

while (i++ < 100000000) {
 var str = 'Hello, I am ' + person.name + ', and I am ' + person.age + ' years old, I come from ' + person.school; 
}

duration = +new Date() - start;
console.log(duration)

经过测试,可以发现时间分别为 2396/2372/2427

es6语法:

var i = 0;
var start = +new Date(),
 duration;

var person = {
 name: 'wayne',
 age: 21,
 school: 'xjtu'
}

while (i++ < 100000000) {
 var str = `Hello, I am ${person.name}, and I am ${person.age} years old, I come from ${person.school}`;
}

duration = +new Date() - start;
console.log(duration)

经过测试,可以发现耗时分别为 2978/3022/3010。

经过计算,使用es6的语法耗时是es5语法的1.25倍左右。 因此,尽量减少在node端使用模板字符串,如果大量使用,显然耗时是非常严重的。

箭头函数

es5语法:

var i = 0;
var start = +new Date(),
 duration;

var func = {};

while (i++ < 10000000) {
 func[i] = function (x) {
  return 10 + x;
 }
}

duration = +new Date() - start;
console.log(duration)

经过测试,发现耗时分别为 1675/1639/1621。

es6语法:

var i = 0;
var start = +new Date(),
 duration;

var func = {};

while (i++ < 10000000) {
 func[i] = (x) => 10 + x
}

duration = +new Date() - start;
console.log(duration)

经过测试,发现耗时分别为 1596/1770/1597。

即使用箭头函数的运行速度和使用es5方式的箭头函数在运行速度上是一致的,并且使用es6的箭头函数写起来更加方便,所以推荐使用,我们可以直接使用。

总结

在node端使用es6还是不错的,对于常见的class、let、箭头函数等等在速度上和es5不相上下,但是在写起来会更加方便,还是推荐使用的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS打印gridview实现原理及代码
Feb 05 Javascript
JavaScript识别网页关键字并进行描红的方法
Nov 09 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
Dec 17 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
Jan 28 Javascript
Bootstrap组件学习之导航、标签、面包屑导航(精品)
May 17 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
Aug 03 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
Aug 25 Javascript
将JSON字符串转换成Map对象的方法
Nov 30 Javascript
JS全角与半角转化实例(分享)
Jul 04 Javascript
vue中的非父子间的通讯问题简单的实例代码
Jul 19 Javascript
JavaScript遍历数组和对象的元素简单操作示例
Jul 09 Javascript
基于ant design日期控件使用_仅月份的操作
Oct 27 Javascript
微信小程序开发实现的IP地址查询功能示例
Mar 28 #Javascript
微信小程序结合mock.js实现后台模拟及调试
Mar 28 #Javascript
详解webpack4.x之搭建前端开发环境
Mar 28 #Javascript
详解Vue.directive 自定义指令
Mar 27 #Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
Mar 27 #Javascript
js取0-9随机取4个数不重复的数字代码实例
Mar 27 #Javascript
vue 详情跳转至列表页实现列表页缓存
Mar 27 #Javascript
You might like
Apache2 httpd.conf 中文版
2006/12/06 PHP
PHP智能识别收货地址信息实例
2019/01/05 PHP
javascript 节点遍历函数
2010/03/28 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
JS表格组件神器bootstrap table详解(基础版)
2015/12/08 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
BootStrap和jQuery相结合实现可编辑表格
2016/04/21 Javascript
详解JavaScript实现设计模式中的适配器模式的方法
2016/05/18 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
js实现一个简单的数字时钟效果
2017/03/29 Javascript
微信小程序 Buffer缓冲区的详解
2017/07/06 Javascript
基于javascript canvas实现五子棋游戏
2020/07/08 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
echarts饼图各个板块之间的空隙如何实现
2020/12/01 Javascript
[15:23]教你分分钟做大人:虚空假面
2014/10/30 DOTA
在Apache服务器上同时运行多个Django程序的方法
2015/07/22 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
深入解析Python的Tornado框架中内置的模板引擎
2016/07/11 Python
django缓存配置的几种方法详解
2018/07/16 Python
Python数据分析matplotlib设置多个子图的间距方法
2018/08/03 Python
django多对多表的创建,级联删除及手动创建第三张表
2019/07/25 Python
Django 反向生成url实例详解
2019/07/30 Python
From CSV to SQLite3 by python 导入csv到sqlite实例
2020/02/14 Python
详细分析Python collections工具库
2020/07/16 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
2020/08/04 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
new修饰符是起什么作用
2015/06/28 面试题
奖学金自我鉴定范文
2013/10/03 职场文书
缅怀先烈演讲稿
2014/09/03 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
2014年业务员工作总结范文
2014/11/17 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
会计工作能力自我评价
2015/03/05 职场文书
MySQL8.0.18配置多主一从
2021/06/21 MySQL
React Fragment介绍与使用详解
2021/11/11 Javascript