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

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

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

你能改进一下吗?

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


当前回答

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

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

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

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

用法很简单:

v = inv(v);

优点是:

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

其他回答

未经测试,但如果你是布尔,我认为var v = !v将工作。

参考:http://www.jackfranklin.co.uk/blog/2011/05/a-better-way-to-reverse-variables

如果你不关心除1以外的任何可能性

v = v ? 0 : 1;

在上述情况下,如果v为0、false、undefined或null, v将最终为1。注意使用这种方法-即使v是"hello world", v也将为0。

我会说得更清楚一点。

v是什么意思?

例如v是某种状态。创建对象Status。在DDD中是一个值对象。

在这个值对象中实现逻辑。这样你就可以以更实用的方式编写代码,从而更易于阅读。切换状态可以在当前状态的基础上创建一个新的status。然后,你的if语句/逻辑被封装在你的对象中,你可以单元测试。valueObject总是不可变的,所以它没有标识。为了改变它的值,你必须创建一个新的。

例子:

public class Status
{
    private readonly int _actualValue;
    public Status(int value)
    {
        _actualValue = value;
    }
    public Status(Status status)
    {
        _actualValue = status._actualValue == 0 ? 1 : 0; 
    }

    //some equals method to compare two Status objects
}

var status = new Status(0);

Status = new Status(status);

一般来说,当你需要在两个值之间切换时,你可以从两个切换值的和中减去当前值:

0,1 -> v = 1 - v 1,2 -> v = 3 - v 4,5 -> v = 9 - v

好吧,我们知道在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/

希望这对你有所帮助:)