ExtendSxriptのバグ

utsutsunogare.hatenablog.com

↑このスクリプト作成中、ExtendScriptのバグらしきものに遭遇したので、そのメモ。

ExtendScriptAdobe製品に搭載されているECMAScript準拠のスクリプト言語(要はJavaScript)。
なので基本的な文法はJavaScriptと同じです。

const a = true, b = true;

const c = a && b || !a && !b

上記のようなコードがあったとき、通常のJavaScriptでは ctrue です。
でもExtendScriptでは false になります。

&&|| の優先順位がおかしい。

演算子の優先順位 - JavaScript | MDN

この二つの演算子の優先順位は && > || です。
例ではまず a && b!a && !b が評価され、それから || の評価という順番です(実際は短絡評価されるのでこの通りではない)。

でもExtendScriptでは a && b の次は || !a が評価されてしまいます。
どうやら優先順位が同列になっているようで、1 + 2 × 3 = 9 と計算しているようなものです。

なので、ExtendScript&&|| を同時に使う場合は、余計なバグを起こさないよう括弧でくくって優先度を明示した方がいい。

……のですが、上述のPhotoshopスクリプトはES6で書いたものをBabelに通して作ったので、余計な括弧が削除されてしまい思わぬバグが引き起こされてしまいました。
結局、冗長ですが判定を二段階に分けて対処することに。

めんどくさい。


ちなみにサンプルで上げたコードは「否定排他的論理和(XNOR)」です。 JavaScriptにはXOR演算子が(ビット演算子しか)ないので愚直に書くとああなりますが、実用上は

const c = a == b

で十分だったりします。
(型によらず判定するなら !!a === !!b