Node.js 4.0 中的 ES 6 特性介紹

linux.cn發表於2015-09-20

Node.js 4.0.0 已經發布了。這是和 io.js 合併之後的首個穩定版本,它帶來了一系列的新特性,支援 ES 6的大部分特性。已經有很多 ES 6 的特性介紹了,這裡我們介紹一下該怎麼使用它們。

Node.js 4.0 中的 ES 6 特性介紹

1. 模板字串

如果你要在 JavaScript 中建立多行字串,你可能會使用如下的語法:

var message = [
    'The quick brown fox',
    'jumps over',
    'the lazy dog'
].join('/n');

對於少量字串這還算合適,但是如果比較多就會顯得混亂。不過,有個聰明的開發者提出了一個叫 multiline 的技巧:

var multiline = require('multiline');
var message = multiline(function () {/*
    The quick brown fox
    jumps over
    the lazy dog
*/});

幸運的是,ES 6 為我們帶來了模板字串:

var message = `
    The quick brown fox
        jumps over
        the lazy dog
`;

此外,它還給我們帶來了字串內插:

var name = 'Schroedinger';

// 不要這樣做 ...
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?`;

在 MDN 上檢視模板字串的細節.

2. 類

在 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.js 中可以使用新的 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 關鍵字、構造子、呼叫超類及屬性,是不是很棒?還不止這些,看看 MDN 上的更詳細的介紹。

3. 箭頭函式

在函式裡面對 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) {
        this.notifyListener(listener);
    }.bind(this));
};

現在你可以使用胖箭頭函式了:

Cat.prototype.notifyListeners = function () {
    this._listeners.forEach((listener) => {
        this.notifyListener(listener);
    });
};

瞭解箭頭函式的更多細節。.

4. 物件字面量

使用物件字面量,你現在有了很漂亮的快捷方式:

var age = 10, name = 'Petsy', size = 32;

// 不要這樣做 ...
var cat = {
    age: age,
    name: name,
    size: size
};

// ... 而是這樣做 ...
var cat = {
    age,
    name,
    size
};

此外,你現在可以很容易地 給你的物件字面量新增函式

5. Promise

不用再依賴像 bluebird 或 Q這樣的第三方庫了,你現在可以使用 原生的 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(() => {});

6. 字串方法

我們也有了一系列新的字串功能:

// 在幾種情況下可以替代 `indexOf()`
name.startsWith('a')
name.endsWith('c');
name.includes('b');

// 重複字串三次
name.repeat(3);

去告訴那些使用 Ruby 的傢伙吧!字串現在也 對 unicode 支援更好了

7. 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。 你可以在 MDN 上了解更多細節

此外,Node.js 也支援 const 關鍵字了,它可以防止你為同一個引用賦予不同的值:

var MY_CONST = 42; // no, no
const MY_CONST = 42; // yes, yes

MY_CONST = 10 // 使用了 const ,這就不行了

結語

Node.js 4.0.0 帶來了更多的 ES6 特性,我希望這七個例子可以吸引你升級到最新版本。

還有更多的語言特性呢(例如,maps/sets, 符號和生成器,這裡只提到了一點)。你可以看看 Node.js 4.0.0 的 ES6 概覽。 趕快升級吧!

相關文章