0

この省略形がどのように機能するかわかりません:

nodes.forEach(function(o, i) {
    o.y += i & 1 ? k : -k;
    o.x += i & 2 ? k : -k;
});

このような省略形のインクリメント演算子は見たことがありません。

ありがとう

4

2 に答える 2

2

i & 1 ? k : -kは、 が に評価されるかどうかに応じて、kまたはに評価されます。-ki & 1true

演算子は&演算子間でビット単位の「and」を実行するため、最初の条件では最下位ビットが設定されているかどうかがチェックされ、2 番目の条件では 2 番目の最下位ビットが設定されているかどうかがチェックされます。

コードは次と同じことを行います。

nodes.forEach(function(o, i) {
  if (i & 1) {
    o.y += k;
  } else {
    o.y -= k;
  }
  if (i & 2) {
    o.x += k;
  } else {
    o.x -= k;
  }
});
于 2013-03-08T17:19:49.887 に答える
1

10000...0001

20000...0010

iおそらく、int のビットとして設定された一連のフラグを格納します。

i & 1最後のビットが設定されていることをテストi & 2し、前のビットが設定されていることをテストします。ビット演算については MDN を参照してください。

このシステムを使用して、JavaScript 番号に約 52 個のフラグを格納できます。

i = 0; // no flag
i |= 4; // sets a flag
i |= 1<<2; // sets the same flag but is more readable
var bool = i & 4; // truish if the flag is set

だからあなたのコードはこれを行います:

if i has flag 1 then o.y += k else o.y += -k
if i has flag 2 then o.x += k else o.x += -k
于 2013-03-08T17:13:41.413 に答える