4

Bitwise対 Assoc Array 反復テストには、次のスニペットがあります。

var arr = [1,0,1,0,0,0,0,0,1,1,0,0,1];
var o = [];
for(var i = 0; i < 100; i++){
    var a = [(Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1)];
    var b = 0;
    for(var j=0; j < a.length; j++){
            b |= (a[j] << j);               
    }
    o << {a: a, b: b};
}

テスト用のデータを準備します。最後のステートメントは、左シフトがあるという事実を除いて、私には意味がありません。インタープリターはエラーをスローせず、黙って受け入れるだけです。

4

2 に答える 2

4

ちょっと泣けます。Array に対して定義された演算子<<はありません。これは、JavaScript のビット単位の左シフトにすぎません。(ただし、Ruby などのさまざまな言語では、配列型でそのような演算子を定義しています。)

したがって、次とほぼ同等です (内部的に両方のオペランドがネイティブToInt32関数を介して変換されます)。

parseInt(o) << parseInt({a: a, b: b})

いくつかの警告フラグがオフになっているはずです:

  • ここでparseInt(または)の[意味のある]結果は何ですか?ToInt32
  • の結果はどこに<<行きますか?

次の簡略化されたコードと比較してください。

var o = []
o << 1
o            // -> []
o.push(2)    // (as suggested by 6502 as the desired operation)
o            // -> [2]
于 2012-06-30T05:52:22.003 に答える
2

たぶん、望ましい意味はo.push({a:a, b:b})です。

これが壊れた実装で機能するかどうかはわかりませんが、標準ではありません。

于 2012-06-30T06:01:43.800 に答える