var a = 1;
alert (a == (a = 2));
a = 1;
alert ((a = 2) == a);
IE8、Firefox 12、Google Chrome 19 では false, true となりますが、DMonkey では逆で true, false になります。
そもそも ECMAScript においてこの式の結果が保証されているのか、未定義や不定や実装依存だったりするのか詳しい人教えてぷりーず。
仮に ECMAScript で正当な式であっても、DMonkey では結果が違うし規格書もないから調べることすら出来ないしで、DMonkey では怪しげな表現は使わない方がいいですね。
ちなみに JavaScript で数値の文字列を3桁区切りに変換するコードで
while (a != (a = ~));
というパターンが使われているのを見かけました。
見かけたっていうか移植しようとしてこの違いに気がついた訳ですが。
おそらくですがECMAScript の仕様としては正しいと思います。
間違っていたら申し訳ないですが
ざっと仕様書を見た感じでは代入演算子も式として扱われており
その都度値をセットするようです
http://www.ecma-international.org/ecma-262/5.1/#sec-11.13
また式の途中で識別子が出てきたらその都度展開しろみたいな事が書かれてあるような
式の定義 評価の順番
http://www.ecma-international.org/ecma-262/5.1/#sec-A.3
識別子参照
http://www.ecma-international.org/ecma-262/5.1/#sec-11.1.2
識別子の解決
http://www.ecma-international.org/ecma-262/5.1/#sec-10.3.1
DMonkeyでは式の評価の順序が異なっており右辺から評価されてしまうため
結果が逆になってしまうようです。
( alert(false) + alert(true) ); //true, false
スタックを使う様な処理では知らないと嵌ってしまうかも
var arr = [1, 2];
alert(arr.pop() - arr.pop()); //-1
arr = [1, 2];
function foo(a, b){alert(a - b);}
foo(arr.pop(), arr.pop()); //-1
ありがとうございます。
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.1
11.9.1 The Equals Operator ( == )
の方を見ると、左辺の値を取り出してから右辺の値を取り出すのが正しいのかも……。