node.jsのharmonyモード

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

harmonyモード?

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

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

harmonyモードでできること

1. for … of ループ

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

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ではオブジェクトのプロパティーが全て文字列のキーを渡せて呼び出せます。例えば:

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化することで、隠すことができます:

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で呼び出すことができます。

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

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

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

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はブロック内定義が一回のみできる変数です:

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は他の言語と同じく定数です:

const CONST_VAR = 'World';
let x;
{
x = 'Hello ' + CONST_VAR;
console.log(x);
}
CONST_VAR = 'World2'; // SyntaxError: Assignment to constant variable.

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

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みたいに使えます。

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にコンパイルするかです。