harmonyモード?
node
コマンドに--harmony
というオプションがあります**。--harmony
オプションをつけることで、ECMAScript6機能の一部が使えるようになります。**
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
プロパティーname
をSymbol
化することで、隠すことができます:
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.let
とconst
var
以外にlet
とconst
というタイプが追加されます:
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にコンパイルするかです。