这个Javascript速记感到困惑

时间:2013-03-08 17:12:32

标签: javascript d3.js

我不明白这个简写是如何运作的:

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

我从未见过像这样的简写增量运算符。

由于

2 个答案:

答案 0 :(得分:2)

表达式i & 1 ? k : -k的评估结果为k-k,具体取决于i & 1是否评估为true

&运算符在运算符之间执行按位'和',因此第一个条件检查是否设置了最低有效位,第二个条件检查是否设置了第二个最低有效位。

代码与:

相同
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 :(得分:1)

10000...0001

20000...0010

i可能存储一组在int上设置为位的标志。

i & 1只测试最后一位设置,i & 2测试之前设置的位。请参阅the MDN on bitwise operators

您可以使用此系统在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