旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

!”key” in object がJSとAS3で挙動が違う

2008年1月1日

※良く調べたら、JSとASの挙動はAS方向に一緒でした!
というわけで以下その点に注意して読んで下さい、最後にちょっと追記があります。

in演算子に!演算子を付けた場合の挙動がJavaScriptとActionScript3で違うという話です。

JavaScriptの場合

!"key1" in {"key1": 123}

!("key1" in {"key1": 123})

という解釈になり、なりません、この式の評価は false になる。

ところがActionScript3の場合、以下の解釈になり

(!"key1") in {"key1": 123}

「!”key1″」 → 「false」 → 「falseをString型に自動型変換」 を経て

"false" in {"key1": 123}

となり、この式の評価は同じく false になる。

この挙動の差は、「!演算子の対象が式なのか値なのか」という差だと思いますが、どっちが正しい挙動なのかはわかりません。

ただ、対象に式を取ってくれないと(つまりJSの方じゃないと)、!演算子の時だけ対象が式じゃないという風に暗記になるのでいきなり不便になる。
・・・うーむ、また、AS3のキモカワイイところを発見しちまった。

ありゃりゃ、書いてる内に年を越しちゃったぜ!
ってことで、初詣でも行ってきまーす。

今年もよろしくお願いします!

【追記】
ゆーきさんから「!演算子の方in演算子より優先順位が高いから、ASの挙動の方が正しいと思う」って突っ込みがあり、調べたらJSもその挙動でした。
優先順位と結合性という概念もありましたねー・・・。

ちなみに以下の式は

"key" in {"key":123} === true

こういう順位で、意図した通りに動きます。

("key" in {"key":123}) === true

これは、in演算子の優先順位の方が、===演算子の優先順位より高いからですね!

・・・

こ、今年も本当によろしくお願いします!