var f = [];
// for 文中の let 宣言
for (let i = 0; i < 3; i++) {
// let 式
f[i] = let (x = i) function (y) { return x + y; };
}
print(f[1](3)); // 4
print(i); // ReferenceError: i is not defined
var a = 10;
// let 文
let (a = 2 * a) {
print(a); // 20
}
print(a); // 10;
{
print(a); // undefined
// let 宣言
let a = 30;
print(a); // 30
}
print(a); // 10
配列リテラル形式およびオブジェクトリテラル形式を使って複数の変数を一括して代入することが可能になった (Bug 336379) 。なお、配列リテラル形式の分割代入は Opera でも利用可能である。(destructuring assignment を何と訳せばいいのか思いつかないのだが brazil 氏に従って「分割代入」とした。)
// 配列リテラル形式の分割代入
var [a, b] = [10, 20];
print(a); // 10
// 変数の交換
[a, b] = [b, a];
print(a); // 20
// オブジェクトリテラル形式の分割代入
// var pi = Math.PI, e = Math.E;
var { PI: pi, E: e } = Math;
print(e); // 2.718281828459045
// 関数の引数における分割代入
[[1, 2], [3, 4], [5, 6]].map(function ([a, b]) { return a + b; });
// [3, 7, 11]
なお、for-in 文中で分割代入を使うとオブジェクトのプロパティ名とそのプロパティの値が代入される。また、分割代入中に左辺式を記述しないとエラーになる。
var obj = { a: 10, b: 20, c: 30 };
for (let [key, value] in obj)
print(key + " = " + value);
// a = 10
// b = 20
// c = 30
var [,,] = [10, 20]; // SyntaxError: missing variable name:
Python からイテレータ機能が取り込まれ、オブジェクトのプロパティに順にアクセスできるようになった (Bug 326466) 。Iterator 関数を呼び出すことでイテレータオブジェクトを得ることができ、イテレータオブジェクトの next メソッドを呼び出すたびにオブジェクトのプロパティ名およびプロパティ値を納めた配列が順に返される。すべてのプロパティが返された後に next メソッドを呼び出すと StopIteration 例外が投げられる。
var obj = { a: 10, b: 20 };
var it = Iterator(obj);
print(it.next().toSource()); // ["a", 10]
print(it.next().toSource()); // ["b", 20]
it.next(); // uncaught exception: [object StopIteration]
Iterator 関数の第 2 引数に true を指定するとプロパティ名のみが列挙される。また、イテレータオブジェクトは for-in 文を使ってもアクセスできる。
var it = Iterator(obj, true);
print(it.next()); // a
var it = Iterator(obj);
for (let i in it)
print(i);
// a,10
// b,20
Iterator 関数は内部的にそのオブジェクトの __iterator__ メソッド (通常は Object.prototype から継承する) を呼び出しているので、__iterator__ メソッドを自分で実装することにより独自のイテレータを返すことができる。
var obj = {
__iterator__: function (keysOnly) {
return Iterator({ a: 10, b: 20 }, keysOnly);
}
};
var it = Iterator(obj);
print(it.next()); // a,10
Python からジェネレータ機能が取り込まれ、イテレータを簡単に作成できるようになった (
コメントをする