升级到Node V4的七个理由 支持大量ES6特性

2016-06-26

Node v499号正式发布了。这个版本是Nodeio.js合并后发布的首个稳定版本,并且为开发者带来了大量的ES6语言扩展。《7 Reasons to Upgrade to Node v4 Now》一文详细介绍了Node V4所具有的七大特性及如何使用。感谢景庄对该文章的翻译,内容如下。此外,你也可以通过这篇文章大致了解 Node.js中包括的ES6语言扩展。

模板字符串

如果你想要在JavaScript中创建一个多行字符串,你可能曾经写过下面这样的代码:

var message = [     'The quick brown fox',     'jumps over',     'the lazy dog' ].join('
');
也许这种方法对于比较少的文本还是比较合适,但如果对于多行的长句子问题可能就变得一团糟了。 于是某个程序员写了个叫multiline的库, 使用hack的方法来解决这个问题:

var multiline = require('multiline'); var message = multiline(function () {/*         the quick brown fox         jumps over         the lazy dog     */});
幸运的是,我们现在可以使用ES6的模板字符串来解决这个问题:

var message = `     The quick brown fox     jumps over     the lazy dog `;
此外,它还为我们带来了字符串插值(string interpolation):

var name = 'Weiwei';  // 不需要这样做了 ... var message = 'Hello ' + name + ', how is your cat?'; var message = ['Hello ', name, ', how is your cat?'].join(''); var message = require('util').format('Hello %s, how is your cat?', name);  // 使用新的方式 ... var message = `Hello ${name}, how is your cat?`;    

在ES5中定义类总会让人感觉到奇怪,并且需要足够的时间去适应这种写法。例如:

var Pet = function (name) {     this._name = name; };  Pet.prototype.sayHello = function () {     console.log('*scratch*'); };  Object.defineProperty(Pet.prototype, 'name', { get: function () {     return this._name; } });  var Cat = function (name) {     Pet.call(this, name); };  require('util').inherits(Cat, Pet);  Cat.prototype.sayHello = function () {     Pet.prototype.sayHello.call(this);     console.log('miaaaauw'); };
幸运的是,如今我们在Node中可以使用ES6的类语法了:

class Pet {      constructor(name) {         this._name = name;       }        sayHello() {         console.log('*scratch*');        }     get name() {         return this._name;       } }   class Cat extends Pet {     constructor(name) {         super(name);         }        sayHello() {         super.sayHello();         console.log('miaaaauw');         } }
使用extends来实现类的继承,使用constructor()方法作为构造器方法,通过这样的方式来实现子类对父类的继承。是不是很棒?还有更多的内容,可以参考MDM

箭头函数

函数调用中的this关键字的动态绑定总是会让人感到困惑,为此,开发人员也试图用不同的方法来解决这个问题:

Cat.prototype.notifyListeners = function () {     var self = this;     this._listeners.forEach(function(listener) {         self.notifyListener(listener);       });  };
或者

Cat.prototype.notifyListeners = function () {     this._listeners.forEach(function(listener) {         self.notifyListener(listener);       }.bind(this));   };
而如今,在Node中你可以直接使用箭头函数了:

Cat.prototype.notifyListeners = function () {     this._listeners.forEach((listener) => {         this.notifyListener(listener);       }); }
点击链接查看关于箭头函数的更多内容。

对象字面量

字面量(或字面值)是源代码中用来描述固定值的记号(token),可能是一个数, 或者是一个字符串。

当你要使用对象字面量的时候,现在有一种更优雅简洁的方式了:

var age = 10, name = 'Petsy', size = 32;  // instead of this ... var cat = {     age: age,     name: name,     size: size };  // ... do this ... var cat = {     age,     name,     size };
并且你也可以轻松的在你的对象字面量里加入函数了。

Promises

现在,你不再需要像bluebird或者Q这样的第三方promise库了,你可以使用原生的Promise。 原生Promise主要暴露了一下API:

var p1 = new Promise(function (resolve, reject) {}); var p2 = Promise.resolve(20); var p3 = Promise.reject(new Error()); var p4 = Promise.all(p1, p2); var p5 = Promise.race(p1, p2);
并且可以配合箭头函数像下面这样写代码:

p1.then(() => {}).catch(() => {});

字符串方法

字符串方法也得到了增强,你现在可以使用新的字符串工具方法了:

// replace `indexOf()` in a number of cases name.startsWith('a') name.endsWith('c'); name.includes('b');  // repeat the string three times name.repeat(3);
并且,现在字符串也能更好的处理unicode的问题了。

let和const

猜猜以下函数调用的返回值:

var x = 20; (function () {     if (x === 20) {         var x = 30;     }     return x; }()); // -> undefined
什么?undefined。使用let来替换var,你将会得到你想要的结果:

let x = 20; (function () {     if (x === 20) {         let x = 30;     }     return x; }()); // -> 20
解释一下原因:var是函数范围的,而let是代码块范围的(这也是大部分人期待的那样)。正因为此,你可以认为let是一个新的var,用于取代var的缺陷。你可以从MDN获取关于let更多的内容。

福利:node现在也支持const关键字了,用于定义常量,避免你给一个常量赋予不同的值。

var MY_CONST = 42; // no, no const MY_CONST = 42; // yes, yes  MY_CONST = 10 // with const, this is no longer possible

总结

Node v4带来了相当多的ES6特性,希望上面的7个理由能够激发你去升级和使用最新的Node版本。

当然,还有更多的语言特性(例如maps/sets、symbols和generators等)。所以,我强烈建议你阅读一下overview of ES6 additions to Node v4。快去升级吧。

参考资料

  1. ES6 on Node.js
  2. Node.js v4.0.0 Documentation

原文链接:7 Reasons to Upgrade to Node v4 Now

译者简介:景庄,前端工程师,关注Node.js、前端工程化。个人博客: http://wwsun.github.com

(责编:陈秋歌)

欢迎加入CSDN前端交流群2:465281214,进行前端技术交流。