node.jsのharmonyモード

ChainZ(クリエイター)
いろいろやってます。

harmonyモード?

nodeコマンドに--harmonyというオプションがあります--harmonyオプションをつけることで、ECMAScript6機能の一部が使えるようになります。

ECMAScript6についてはこの記事ご覧ください:ECMAScript6 – 次期のJavaScriptはこうなる?

harmonyモードでできること

1. for … of ループ

JavaScriptにこのイテレータがないのがずっと謎でした。--harmonyのおかげで使えるようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
var animals = [
    { type: 'cat', name: 'Kitty'},
    { type: 'dog', name: 'Taro'},
    { type: 'fish', name: 'Poyo'},
];

var animal;
for (animal of animals) { // ofです、inではありません
    console.log('The ' + animal.type + "'s name is " + animal.name);
}
// The cat's name is Kitty
// The dog's name is Taro
// The fish's name is Poyo

2.Symbols(シンボル)

JavaScriptではオブジェクトのプロパティーが全て文字列のキーを渡せて呼び出せます。例えば:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var Obj = (function(){

    function Obj(name)
    {
        this.name = name;
    }

    Obj.prototype = {
        sayHello : function()
        {
            console.log(this.name + ': Hello !');
        }
    }

    return Obj;
})();

var obj = new Obj('Object');
obj.sayHello(); // Object2: Hello !
console.log(obj.name); // Object2

プロパティーnameSymbol化することで、隠すことができます:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var Obj = (function(){

    var keys = {
        name : Symbol("name"),
    };

    function Obj(name)
    {
        this[keys.name] = name;
    }

    Obj.prototype = {
        sayHello : function()
        {
            console.log(this[keys.name] + ': Hello !');
        }
    }

    return Obj;
})();

var obj = new Obj('Object');
obj.sayHello(); // Object2: Hello !
console.log(obj.name); // undefined

Symbolはユニークです。Object.getOwnPropertySymbolsで呼び出すことができます。

1
2
console.log(Object.getOwnPropertySymbols(obj));
// [ Symbol(name) ]

3.拡張されたStringメソード

Stringに便利なメソードがいくつか追加されます:

1
2
3
4
5
6
7
8
9
10
11
console.log('Hello'.startsWith('Hell'));
//true

console.log('Hello'.endsWith('lol'));
// false

console.log('Hello'.includes('el'));
// true

console.log('='.repeat(10) + ' Hello ' + '='.repeat(10));
// ========== Hello ==========

4.letconst

var以外にletconstというタイプが追加されます:

letを使うには、use strictが必要です。

letはブロック内定義が一回のみできる変数です:

1
2
3
4
5
6
7
8
9
const CONST_VAR = 'World';
let x;
{
    x = 'Hello ' + CONST_VAR;
    console.log(x); // 'Hello World'
    x = 'Goodbye ' + CONST_VAR;
    console.log(x); // 'Goodbye World'
}
let x = 'Hello2'; // SyntaxError: Identifier 'x' has already been declared

constは他の言語と同じく定数です:

1
2
3
4
5
6
7
const CONST_VAR = 'World';
let x;
{
    x = 'Hello ' + CONST_VAR;
    console.log(x);
}
CONST_VAR = 'World2'; // SyntaxError: Assignment to constant variable.

5.=>文法が使えるようになります。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var books = [
    { title: '', author: '' },
    { title: '', author: '' },
    { title: '', author: '' },
];

// JavaScript
var fav = books.filter(function(book){
    return book.author == '';
});
console.log(fav);

// --harmony
var fav = books.filter(book => {
    return book.author == '';
});

6. Generator

Generatorは膨大なリストなどに便利です。Bufferみたいに使えます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function* NumberGenerator(start)
{
    var cur = start || 0;
    while (true) {
        yield cur;
        cur++;
    }
}
var n = NumberGenerator();
console.log(n.next().value); // 0
console.log(n.next().value); // 1
console.log(n.next().value); // 2

var n2 = NumberGanerator(100);
console.log(n2.next().value); // 100
console.log(n2.next().value); // 101
console.log(n2.next().value); // 102

まとめ

--harmnoyオプションをつけるとnodeが多少使いやすくなるので、個人的には使うのをおすすめします。harmnoyでECMAScript6の機能は若干入っていますが、まだサポートされてないものがたくさんあります。ECMAScript6を満喫したければ、nodeの別バージョンio.jsを使うか、babel.jsで既存のコードをJavaScriptにコンパイルするかです。