この省略形がどのように機能するかわかりません:
nodes.forEach(function(o, i) {
o.y += i & 1 ? k : -k;
o.x += i & 2 ? k : -k;
});
このような省略形のインクリメント演算子は見たことがありません。
ありがとう
この省略形がどのように機能するかわかりません:
nodes.forEach(function(o, i) {
o.y += i & 1 ? k : -k;
o.x += i & 2 ? k : -k;
});
このような省略形のインクリメント演算子は見たことがありません。
ありがとう
式i & 1 ? k : -k
は、 が に評価されるかどうかに応じて、k
またはに評価されます。-k
i & 1
true
演算子は&
演算子間でビット単位の「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;
}
});
1
は0000...0001
2
は0000...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