ExtendScriptにおける三項演算子の不具合(?)
追記(2021/10/26)
var x = 30;
— あるふぁ(仮) (@peprintenpa) 2021年10月25日
var z = (x < 10) ? 'a' :
(x < 50) ? 'b' :
'c';
$.writeln(z); // => b これは問題無し
これが正しいのはたまたまですね。x=5とかだとおかしくなる。
こういうネタ集めて記事にしてるのでぜひ読んでみてくださいhttps://t.co/Hrb1WQO9HY
— あるふぁ(仮) (@peprintenpa) 2021年10月25日
2つ目のツイートでご紹介いただいているのはこちらの記事です。 sysys.blog.shinobi.jp
また、Uske-Sさんが詳しく検証・解説してくださっています!
私が投稿した以下の文章には誤りが含まれますので、正しい情報をお探しの方はこちらの記事をご覧になることをおすすめします。
(2021/10/26)
ExtendScriptでは、三項演算子を入れ子にするとシンタックスエラーになります。
var x = 30; var y = (x > 10) ? (x < 50) ? 'a' : 'b' : 'c'; $.writeln(y); //条件1・2ともtrueなので"a"になるはずだが、Syntax Errorになる
これについてはフォーラムで解説されています。
それとは別に、よく分からない挙動に行きあったので記録しておきます。
簡単に述べると、別の書き方で入れ子にしたときに、エラーを出さずに誤った値が返されることがあるようです(私が何か誤解しているのでなければ…)。
var x = 30; var z = (x < 10) ? 'a' : (x < 50) ? 'b' : 'c'; $.writeln(z); // => b これは問題無し //Google Chrome デベロッパー・ツールでは //console.log(z); => b var zz = (x < 10) ? 'aa' : (x < 50) ? 'bb' : (x < 90) ? 'cc' : 'dd'; $.writeln(zz); // => cc これは誤り //Google Chrome デベロッパー・ツールでは //console.log(zz); => bb var zzz = (x < 10) ? 'aaa' : (x < 50) ? 'bbb' : (x < 90) ? 'ccc' : (x < 120) ? 'ddd' : 'eee'; $.writeln(zzz); // => ddd これは誤り //Google Chrome デベロッパー・ツールでは //console.log(zzz); => bbb
最初にご紹介したフォーラムのスレッドには、
there seems to be some differences in operator precedence in ExtendScript vs. modern JavaScript versions
(ExtendScriptと最新のJavaScriptバージョンでは、演算子の優先順位にいくつかの違いがあるようだ)
とあります。
もしかしたらこのことが関係しているのかもしれません。
個人的には三項演算子を使うことはほとんどありません。
他の方が作成されたスクリプトを読むときのために、心に留めておこうと思います。