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

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

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

你能改进一下吗?

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


当前回答

另一种形式的原始解决方案:

v = Number(v == 0);

编辑:感谢TehShrike和Guffa指出了我最初解决方案中的错误。

其他回答

比如v= 1 - v,或者v ^= 1或者v= +!v都能完成工作,但它们构成了我所说的黑客。这些不是漂亮的代码行,而是达到预期效果的廉价技巧。1 - v不传达“在0和1之间切换值”。这会降低代码的表现力,并引入一个地方(尽管很小),另一个开发人员将不得不解析您的代码。

相反,使用v = toggle(v)这样的函数可以快速传达意图。

你可以简单地使用:

v = 1 - v;

当然,这是假设变量初始化正确,即它只有值0或1。

另一种方法更短,但使用了不太常见的操作符:

v ^= 1;

编辑:

清楚:清楚;我从来没有把这个问题作为代码高尔夫来处理,只是为了找到一种不使用任何模糊技巧(如操作符的副作用)的简单方法来完成任务。

v = Number(!v)

它将反向布尔值类型转换为Number,这是期望的输出。

这是缺失的:

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 ...

我不知道你为什么要建立你自己的布尔值?我喜欢时髦的语法,但为什么不编写易懂的代码呢?

这不是最短/最快的,但最清楚的(每个人都能读懂)是使用众所周知的if/else状态:

if (v === 0)
{
  v = 1;
}
else
{
  v = 0;
}

如果你想更清楚,你应该使用布尔值而不是数字。在大多数情况下,它们足够快。对于布尔值,你可以使用这样的语法,它将在简短中获胜:

v = !v;