我想在0和1之间切换一个变量。如果是0,我就设它为1,如果是1,我就设它为0。

这是一个非常基本的运算,我经常写,我想研究一下最短,最清晰的方法。这是我目前为止最好的:

v = (v == 0 ? 1 : 0);

你能改进一下吗?

编辑:这个问题问的是如何在保持清晰的情况下用最少的字符写出上面的语句——为什么这“不是一个真正的问题”?这并不是一个代码-高尔夫练习,尽管一些有趣的答案来自于把它当作高尔夫的人——很高兴看到高尔夫以一种建设性和发人深省的方式被使用。


当前回答

好吧,我们知道在javascript中只有布尔比较也会给你预期的结果。

比如v = v = 0就足够了。

下面是它的代码:

Var v = 0; Alert ("if v = 0 output: " + (v == 0)); setTimeout(函数(){ V = 1; alert("if v = 1 Output: " + (v == 0)); }, 1000);

JSFiddle: https://jsfiddle.net/vikash2402/83zf2zz0/

希望这对你有所帮助:)

其他回答

因为0是一个假值,1是一个真值。

v = (v ? 0 : 1);

如果你喜欢用真和假来代替数字

v = !v;

或者如果它们必须是数字:

v = +!v; /* Boolean invert v then cast back to a Number */

为了总结另一个答案,一个评论和我自己的观点,我建议结合两件事:

使用一个函数进行切换 在这个函数中使用一个可读性更好的实现

下面是一个函数,你可以把它放在一个库中,也可以把它包装在另一个Javascript框架的插件中。

function inv(i) {
  if (i == 0) {
    return 1
  } else {
    return 0;
  }
}

用法很简单:

v = inv(v);

优点是:

无代码复制 如果您或任何人将来再次阅读这篇文章,您将在最短的时间内理解您的代码。

只是为了好玩:v = Math.pow(v-1,v)也在1和0之间切换。

因为这是JavaScript,我们可以使用一元的+转换为int:

v = +!v;

这将在逻辑上不是v的值(如果v == 0则为真,如果v == 1则为假)。然后我们将返回的布尔值转换为相应的整数表示。

这是缺失的:

v = [1, 0][v];

它也可以像轮询一样工作:

v = [2, 0, 1][v]; // 0 2 1 0 ...
v = [1, 2, 0][v]; // 0 1 2 0 ...
v = [1, 2, 3, 4, 5, 0][v]; // 0 1 2 3 4 5 ...
v = [5, 0, 1, 2, 3, 4][v]; // 0 5 4 3 2 1 0 ...

Or

v = {0: 1, 1: 0}[v];

最后一个解决方案的魅力在于,它也适用于所有其他值。

v = {777: 'seven', 'seven': 777}[v];

对于一个非常特殊的情况,比如获取一个(变化的)值并且未定义,这个模式可能是有用的:

v = { undefined: someValue }[v]; // undefined someValue undefined someValue undefined ...