ECMAScript 6th, Harmony と JS++

内容がとても面白い。
Mozilla JavaScripterなら知っているものは多そうだが。
SpiderMonkeyで独自に採用されているものが将来的にECMAScriptに採用されて仕様に載ると良いなと思う。

ということで内容を紹介と個人的メモ

ブロックスコープ

let

JavaScriptで変数宣言というと、var一択で、これは関数ブロックに対するスコープとなり、真のブロックスコープは存在しない。
ということでletってのが登場。
for文、ifのブロック内でのスコープを提供できるよ。

for (let i = 0; i < 3; i++){
  // ...;
}
typeof i; // undefined

ifor文内のみのスコープなので、その外のブロックではundefinedとなりますよと。

これはMozillaが実装していて

<script type="application/javascript;version=1.7">...</script>

とすることで使用可能。

const

定数を宣言するconstがありますよ。

ES5でも

Object.defineProperty(this, "foo", {
  writable: false,
  configurable: false,
  value: "FOO"
});

とすればできなくはないけど、定数を簡単に宣言できると楽ですね〜

これもMozillaJavaScriptでは使用可能。

inline block
{
  let a = 1;
  a; // 1
  var b = 2;
}
typeof a; // undefined
b;        // 2

インラインのブロックでlet宣言しても外には漏れませんよ。

Descructuring

{
  let [a, b] = [1, 2];
  a; // 1
  b; // 2

  [a, b] = [b, a];
  a; // 2
  b; // 1

  // ここまではMozillaで実装済み
  // 以下、提案中

  let [c, ...d] = [1, 2, 3];
  c; // 1
  d; // [2, 3]
}

分割代入やそれを利用した値の交換までは知っていたが、...なんて記法が提案されていたとは驚き。

var str = "hoge";
var [a, ...b] = str;
a; // "h"
b; // "oge"

なんてのも可能なのだろうか...。

Comprehensions

配列内包ってやつ。

[odd for each (odd in [1, 2, 3, 4]) if (odd % 2)] // [1, 3]

これもMozillaでは実装済

Iterators

イテレーター。
Iteratorという特殊なオブジェクトとfor文を使用して繰り返し処理ができますよ。

for (let [key, value] in Iterator({ name: "Andrea", age: 32 })) {
  [key, value]; // ["name", "Andrea"]
                // ["age" , 32]
}

これもMozillaでは実装済

Generators

Iteratorとセットと言う感じ。
これもMozillaでは実装済

この辺りはJavaScript 1.7 の新機能 - MDC Doc Centerを見たほうが良いかも

Parameters

関数のパラメータ

function funcName (num ,exp ||=2) { ...; }
function funcName (num ,exp ??=2) { ...; }

indentifier ||= expression
or
indentifier ??= expression
という感じかしら。未指定の場合にデフォルト値を定められるような雰囲気

let concat = function (first, ...others) {
  return [first].concat(others);
}

パラメータにも...の記法が使えて、配列として得られるみたい。

Proxy

Firefox4で一部実装されているもの。
内部関数の[[Get]]などを上書き(?)できる仕組み。

WeakMaps

メモリリークを解消するためのものらしい。オブジェクトへの参照がなくなった時点で即時GCされるんだと想像しているが、よく分からない。