練炭ブログ

萌え壁紙、Irvine、DMonkey、Proxomitron などの情報を扱ってます。

DMonkey: 変数と代入結果の比較

2 個のコメント»
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 = ~));

というパターンが使われているのを見かけました。

見かけたっていうか移植しようとしてこの違いに気がついた訳ですが。

2 Responses

  1. おそらくですが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

  2. ありがとうございます。

    http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.1
    11.9.1 The Equals Operator ( == )

    の方を見ると、左辺の値を取り出してから右辺の値を取り出すのが正しいのかも……。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です