ECMAScript 6th, Harmony と JS++
内容がとても面白い。
Mozilla JavaScripterなら知っているものは多そうだが。
SpiderMonkeyで独自に採用されているものが将来的にECMAScriptに採用されて仕様に載ると良いなと思う。
ということで内容を紹介と個人的メモ
ブロックスコープ
let
JavaScriptで変数宣言というと、var一択で、これは関数ブロックに対するスコープとなり、真のブロックスコープは存在しない。
ということでletってのが登場。
for文、ifのブロック内でのスコープを提供できるよ。
for (let i = 0; i < 3; i++){ // ...; } typeof i; // undefined
iはfor文内のみのスコープなので、その外のブロックではundefined
となりますよと。
これはMozillaが実装していて
<script type="application/javascript;version=1.7">...</script>
とすることで使用可能。
const
定数を宣言するconstがありますよ。
ES5でも
Object.defineProperty(this, "foo", { writable: false, configurable: false, value: "FOO" });
とすればできなくはないけど、定数を簡単に宣言できると楽ですね〜
これもMozillaのJavaScriptでは使用可能。
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]
Iterators
イテレーター。
Iteratorという特殊なオブジェクトとfor文を使用して繰り返し処理ができますよ。
for (let [key, value] in Iterator({ name: "Andrea", age: 32 })) { [key, value]; // ["name", "Andrea"] // ["age" , 32] }
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]]などを上書き(?)できる仕組み。