被这个Javascript速记搞糊涂了

被这个Javascript速记搞糊涂了,javascript,d3.js,Javascript,D3.js,我不明白这个速记法是怎么用的: nodes.forEach(function(o, i) { o.y += i & 1 ? k : -k; o.x += i & 2 ? k : -k; }); 我从未见过这样的速记增量运算符 谢谢1是0000…0001 2是0000…0010 i可能在int上存储一组设置为位的标志 i&1仅测试设置的最后一位,i&2测试设置之前的一位。看 使用此系统,您可以在javascript编号中存储大约52个标志: i = 0; // n

我不明白这个速记法是怎么用的:

nodes.forEach(function(o, i) {
    o.y += i & 1 ? k : -k;
    o.x += i & 2 ? k : -k;
});
我从未见过这样的速记增量运算符


谢谢

1
0000…0001

2
0000…0010

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

i&1
仅测试设置的最后一位,
i&2
测试设置之前的一位。看

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

1
0000…0001

2
0000…0010

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

i&1
仅测试设置的最后一位,
i&2
测试设置之前的一位。看

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

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

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

该代码与以下代码相同:

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;
  }
});

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

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

该代码与以下代码相同:

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;
  }
});

这可能是对偶数/奇数的测试吗?(我不是说这是一个好的测试)如果我是奇数,那么增加o.y k,或者减少o.y kNo,第二个测试没有什么奇怪的地方,它看起来真的像一个标志存储(这在C中非常常见)。这是偶数/奇数的测试吗?(我不是说这是一个好的测试)如果我是奇数,那么增加o.y k或者减少o.y kNo,第二个测试没有什么奇怪的地方,它看起来真的像一个标志存储(这在C中非常常见)。这其中哪一部分很麻烦?是
a吗?b:c
(三元运算符)?或者是
&
(按位和)?@mwcz:这就是问题所在。@MarcelKorpel Guffa的回答解释道:)@mwcz:我知道它是做什么的,只是调用方式与你写的不同。它在检查
I
的数字是奇数还是偶数。如果其中一个是真的,则进行加法或减法运算。这其中哪一部分比较麻烦?是
a吗?b:c
(三元运算符)?或者是
&
(按位和)?@mwcz:这就是问题所在。@MarcelKorpel Guffa的回答解释道:)@mwcz:我知道它是做什么的,只是调用方式与你写的不同。它在检查
I
的数字是奇数还是偶数。如果其中一个为真,则进行加法或减法运算。