我想在0和1之间切换一个变量。如果是0,我就设它为1,如果是1,我就设它为0。
这是一个非常基本的运算,我经常写,我想研究一下最短,最清晰的方法。这是我目前为止最好的:
v = (v == 0 ? 1 : 0);
你能改进一下吗?
编辑:这个问题问的是如何在保持清晰的情况下用最少的字符写出上面的语句——为什么这“不是一个真正的问题”?这并不是一个代码-高尔夫练习,尽管一些有趣的答案来自于把它当作高尔夫的人——很高兴看到高尔夫以一种建设性和发人深省的方式被使用。
我想在0和1之间切换一个变量。如果是0,我就设它为1,如果是1,我就设它为0。
这是一个非常基本的运算,我经常写,我想研究一下最短,最清晰的方法。这是我目前为止最好的:
v = (v == 0 ? 1 : 0);
你能改进一下吗?
编辑:这个问题问的是如何在保持清晰的情况下用最少的字符写出上面的语句——为什么这“不是一个真正的问题”?这并不是一个代码-高尔夫练习,尽管一些有趣的答案来自于把它当作高尔夫的人——很高兴看到高尔夫以一种建设性和发人深省的方式被使用。
当前回答
因为0是一个假值,1是一个真值。
v = (v ? 0 : 1);
如果你喜欢用真和假来代替数字
v = !v;
或者如果它们必须是数字:
v = +!v; /* Boolean invert v then cast back to a Number */
其他回答
v = !v * 1
乘以1将布尔值转换为数字
解决方案列表
我想提出三个解决方案。它们都将任何值转换为0(如果1,true等)或1(如果0,false, null等):
V = 1*!v V = +!v V = ~~!v
还有一个额外的,已经提到过,但聪明和快速(虽然只适用于0和1):
V = 1-v
解决方案1
您可以使用以下解决方案:
v = 1*!v
这将首先将整数转换为相反的布尔值(0为True,任何其他值为False),然后在乘以1时将其视为整数。结果0将被转换为1,任何其他值将被转换为0。
作为证明,请参阅这个jsfiddle并提供您希望测试的任何值:jsfiddle.net/rH3g5/
结果如下:
-123将转换为整数0, -10将转换为整数0, -1将转换为整数0, 0会转换成整数1, 1会转换成整数0, 2会转换成整数0, 60会转换成整数0,
解决方案2
正如mblase75指出,jAndy有一些其他的解决方案,作为我的工作:
v = +!v
它还首先将原始值转换为布尔值,但使用+而不是1*将其转换为整数。结果完全相同,但符号更短。
解决方案3
另一种方法是使用~~操作符:
v = ~~!v
它非常不常见,总是从布尔值转换为整数。
因为0是一个假值,1是一个真值。
v = (v ? 0 : 1);
如果你喜欢用真和假来代替数字
v = !v;
或者如果它们必须是数字:
v = +!v; /* Boolean invert v then cast back to a Number */
你可以简单地使用:
v = 1 - v;
当然,这是假设变量初始化正确,即它只有值0或1。
另一种方法更短,但使用了不太常见的操作符:
v ^= 1;
编辑:
清楚:清楚;我从来没有把这个问题作为代码高尔夫来处理,只是为了找到一种不使用任何模糊技巧(如操作符的副作用)的简单方法来完成任务。
如果你不关心除1以外的任何可能性
v = v ? 0 : 1;
在上述情况下,如果v为0、false、undefined或null, v将最终为1。注意使用这种方法-即使v是"hello world", v也将为0。