Node.js v6 With ES6

自從 Node.js v4 之後,逐漸支援 ES6 相關的規範。到了今年 Node.js 也已經更新到 v6 了,在 v6.4.0 這個版本,也支援了約 95% 的 ES6 規範。

甚至於 version 7 都已經準備要推出了(支援約 99% ES6 規範),就讓我們來看看 Node.js v6 支援了哪些 ES6 好用的功能。

Node.js v6 With ES6

let

在 Node.js v5 不直接支援 let 宣告方式,但是 v6 已經全面支援了。

let 最主要就是作用域受到了規範,不會像以前使用 var 來宣告,一不小心就變成 global 變數,看以下例子會更為清楚。

以前的寫法

if(true) {
    var foo = 1;
    console.log(foo);    // 1
}

console.log(foo);        // 1

foo 已經變成全域變數了,為了避免這類的問題,因此採用 let 進行變數宣告會是比較好的習慣。

現在的寫法

if(true) {
    let foo = 1;
    console.log(foo);    // 1
}

console.log(foo);        // ReferenceError: foo is not defined

foo 這個變數被限制在 if 判斷式裡面。

從上面這個方法進行宣告之後,variable 範圍僅限於 if block 當中,在 if 外圍將無法呼叫 foo 這個變數,離開 if 範圍 foo 也就生命週期結束。

Default function parameters

在函式參數中可以設定預設值,沒有傳入參數則就會有預設值。

function add(a, b = 10) {
    console.log(a + b);
}

add(3);      // 13
add(3, 5);   // 8

Rest parameters

傳入的參數不用一個一個設定,也不用像以前這樣自己處理 arguments 物件。

以前的寫法

function foo() {
    console.log(arguments);
};

foo(1,2,3,4,5); // { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 }

現在的寫法

function foo(...args) {
    console.log(args);
}

foo(1,2,3,4,5);  // [1,2,3,4,5]

Spread operator

以前的寫法

function foo(a, b, c) {
    console.log(a + b + c);
}
var args = [0, 1, 2];
foo.apply(null, args);  // 3

現在的寫法

function foo(a, b, c) {
    console.log(a + b + c);
}
var args = [0, 1, 2];
foo(...args);  // 3

Destructuring

可以直接宣告一個陣列變數,找到陣列中相對應的值

var [a, b] = [1,2,3,4,5];
console.log(a); // 1
console.log(b); // 2

new.target

確認是調用函式,還是去 new 一個新的物件

function foo() {
    if (!new.target){
        return console.log('這不是 new 出來的物件');
    }
    console.log('我 new 出來了');
}

foo();         // 這不是 new 出來的物件
new foo();     // 我 new 出來了

Symbols

宣告某一個值是唯一不可重複

Symbol("foo") === Symbol("foo"); // false

Array.prototype.includes

用法跟 in 有點類似

in 的寫法

console.log(1 in [1,2,3,4,5]);  // true

includes 的寫法

console.log([1, 2, 3].includes(1)); // true

尚未支援但是好用的 ES6 功能

import

現在 import 一直處於爭議性的狀態,也沒辦法確認最後是否會支援這個語法與功能。

以前的寫法

var express = require('express');

var Router = require('express').Router;

現在的寫法

import express from 'express';

import { Router } from 'express';

async await

這種寫法可以不透過 callback 或是其他第三方套件來讓 code 變得更優雅,讓原本需要複雜 flow control 流程的 JavaScript ,變成一種 synchronize 模式。

讓開發者可以依照以往的開發模式進行,也讓程式碼閱讀流程簡潔許多。

以前的寫法

var request = require('request');

exports = function(req, res, next) {
    var foo;
    request('http://www.google.com', function(err, res, body) {
        if(err) {
            console.log(err);
        }
        foo = body;
        return res.send(foo);
    });
};

現在的寫法

import request from 'request';

exports = async function(req, res, next) {
    let foo = await request('http://www.google.com')
    return res.send(foo);
};

透過 await / async 的宣告方式,將會等到 request 收到結果後將回傳資料存入 foo 當中,接著就進行 foo 資料回傳到前端。

以往需要特別注意 callback hell 或者 callback flow 的問題,將透過 await / async 輕鬆解決。

Node.js ES6 Feature

如果想要知道 Node.js 版本與支援 ES6 的項目,可以在 node green 這個網站查詢。

ES6 的一些特性,增加了程式碼的可閱讀性,減少了程式碼的行數,不但開發手法更加優雅,也使得維護性變高,所以尚未改為 ES6 的朋友們,趕快來試用看看吧。

JSDC 2016 推薦議程

本次議程中,如果對於 ES6 / ES7 語法有興趣者,可以參考底下推薦議程,相信會大有收穫。

360 最大前端開發團隊 - 奇舞團不但將 ES6 發揮到淋漓盡致,更自己去開發自己的 framework,想要深入了解 ES6 與 Node.js 的應用,千萬不能錯過這一場。

想要瞭解更多 ES6 相關應用,這位講者提供了類似各項程式語言底層實做的經驗,這對於喜歡撰寫物件導向程式語言的朋友們,這一定絕對要參與深入 ES 講題。

JSDC 2016 活動現正開賣中,對於開發,JavaScript 深度中毒,以及喜愛開發的朋友們,不可錯過的年度研討會,

 - JSDC 2016 報名網址

 - JSDC 2016 官方


授權聲明

授權為 JSDC 及作者所有。有關任何文章以及資料授權請洽 hq [AT] jsdc.tw