对这个Javascript简写感到困惑

Confused by this Javascript shorthand

本文关键字:Javascript      更新时间:2023-09-26

我不明白这种速记是如何工作的:

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

&运算符在两个运算符之间按位进行"与"操作,因此第一个条件检查是否设置了最低有效位,第二个条件检查是否设置了第二个最低有效位。

代码的作用与

相同
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 is 0000...0001

2 is 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