コモノExtendScript100本ノック

超初心者のDTPオペレーターが週にひとつスクリプトを書くブログ

ExtendScriptにおける三項演算子の不具合(?)

追記(2021/10/26)

Twitterあるふぁ(仮)さんに教えていただきました!

2つ目のツイートでご紹介いただいているのはこちらの記事です。 sysys.blog.shinobi.jp

また、Uske-Sさんが詳しく検証・解説してくださっています!

uske-s.hatenablog.com

私が投稿した以下の文章には誤りが含まれますので、正しい情報をお探しの方はこちらの記事をご覧になることをおすすめします。

(2021/10/26)

 


 

ExtendScriptでは、三項演算子入れ子にするとシンタックスエラーになります。

var x = 30;
var y = (x > 10) ? (x < 50) ? 'a' : 'b' : 'c';
$.writeln(y); //条件1・2ともtrueなので"a"になるはずだが、Syntax Errorになる

これについてはフォーラムで解説されています。

community.adobe.com

それとは別に、よく分からない挙動に行きあったので記録しておきます。
簡単に述べると、別の書き方で入れ子にしたときに、エラーを出さずに誤った値が返されることがあるようです(私が何か誤解しているのでなければ…)。

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バージョンでは、演算子の優先順位にいくつかの違いがあるようだ)

とあります。
もしかしたらこのことが関係しているのかもしれません。

個人的には三項演算子を使うことはほとんどありません。
他の方が作成されたスクリプトを読むときのために、心に留めておこうと思います。

参考