我想在0和1之间切换一个变量。如果是0,我就设它为1,如果是1,我就设它为0。
这是一个非常基本的运算,我经常写,我想研究一下最短,最清晰的方法。这是我目前为止最好的:
v = (v == 0 ? 1 : 0);
你能改进一下吗?
编辑:这个问题问的是如何在保持清晰的情况下用最少的字符写出上面的语句——为什么这“不是一个真正的问题”?这并不是一个代码-高尔夫练习,尽管一些有趣的答案来自于把它当作高尔夫的人——很高兴看到高尔夫以一种建设性和发人深省的方式被使用。
我想在0和1之间切换一个变量。如果是0,我就设它为1,如果是1,我就设它为0。
这是一个非常基本的运算,我经常写,我想研究一下最短,最清晰的方法。这是我目前为止最好的:
v = (v == 0 ? 1 : 0);
你能改进一下吗?
编辑:这个问题问的是如何在保持清晰的情况下用最少的字符写出上面的语句——为什么这“不是一个真正的问题”?这并不是一个代码-高尔夫练习,尽管一些有趣的答案来自于把它当作高尔夫的人——很高兴看到高尔夫以一种建设性和发人深省的方式被使用。
当前回答
如果只有两个值,如本例中的(0,1),我认为使用int是浪费的。宁愿用布尔值,用比特来计算。我知道我在假设,但在两种状态之间切换布尔似乎是理想的选择。
其他回答
这是缺失的:
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 ...
另一种形式的原始解决方案:
v = Number(v == 0);
编辑:感谢TehShrike和Guffa指出了我最初解决方案中的错误。
为了总结另一个答案,一个评论和我自己的观点,我建议结合两件事:
使用一个函数进行切换 在这个函数中使用一个可读性更好的实现
下面是一个函数,你可以把它放在一个库中,也可以把它包装在另一个Javascript框架的插件中。
function inv(i) {
if (i == 0) {
return 1
} else {
return 0;
}
}
用法很简单:
v = inv(v);
优点是:
无代码复制 如果您或任何人将来再次阅读这篇文章,您将在最短的时间内理解您的代码。
你可以简单地使用:
v = 1 - v;
当然,这是假设变量初始化正确,即它只有值0或1。
另一种方法更短,但使用了不太常见的操作符:
v ^= 1;
编辑:
清楚:清楚;我从来没有把这个问题作为代码高尔夫来处理,只是为了找到一种不使用任何模糊技巧(如操作符的副作用)的简单方法来完成任务。
如果只有两个值,如本例中的(0,1),我认为使用int是浪费的。宁愿用布尔值,用比特来计算。我知道我在假设,但在两种状态之间切换布尔似乎是理想的选择。