macOS Sierra JavaScript

しまった、忘れていた!
JXA は var キーワードとセミコロンは不要だった。

前回 macOS Sierra では JavaScript にて let が使えると書いた。
ならば let キーワードなら let で、無宣言なら var と同じで合っている?

というか本当に let の仕様どうりなのか?
ちゃっちゃと書いて試してみる。

#!/usr/bin/osascript

// @ macOS Sierra

// let Test
let test1 = "let Keyword";
for (let i=0; i<2; i++) {
    let test1 = "for " + i;
    //console.log(test1);
}
console.log(test1); //=> let Keyword

var test2 = "var Keyword";
for (let i=0; i<2; i++) {
    var test2 = "var " + i;
    //console.log(test2);
}
console.log(test2); //=> var 1

test3 = "No Keyword == var";
for (let i=0; i<2; i++) {
    test3 = "Null " + i;
    //console.log(test3);
}
console.log(test3); //=> Null 1

やはり。
let キーワードだとブロックの内側に左右されないと確認できた。

ついでに、最近知ったけど Swift の let キーワードって定数宣言なのね。
まぎらわしいよ、何故 const にしなかったのだろう?

そうそう、let は JavaScript 1.7 で追加されたキーワード。
JavaScript 1.7 にフル対応しているのかな?
つまり yield ジェネレーター等も使えるのだろうか。

JavaScript 1.7 の新機能 – JavaScript | MDN

#!/usr/bin/osascript

// Generator Test
function get_yield() {
    let ss = ["first", "second"];
    yield ss[0];
    yield ss[1];
}
let g = get_yield()
console.log(g.next());
console.log(g.next());

yield_test

駄目だ、yield と書いた時点でエラーになる。
イテレータもエラー、Iterator 関数では何故かエラーにはならない。

どうやら 1.7 の一部に対応ということみたい。
まあ今後のバージョンアップで上記も対応してくれるだろう。

それと、少し話がズレるけど。
関数でタプル(配列)を戻す場合に Gjs と同じように取得できるように。

#!/usr/bin/osascript

// Tuple Test
function get_tuple() {
    return [1, 2, 3, "Daaaaaaaaaa!"];
}
let [aaa, bbb, ccc, ddd] = get_tuple();
console.log(aaa);
console.log(bbb);
console.log(ccc);
console.log(ddd);

地味に解りやすい。

ちなみに Gjs は全部問題なく 1.7 仕様が使える。
まあそりゃ実行エンジンが spidermonkey ですし。

gjs_yield

V8 エンジンの Node.js はみんな var で書いているけどどうなんだろう?
機会が無くていまだに手を出していないんだけど。