我想在0和1之间切换变量。如果它是0我想将其设置为1,否则如果它是1我想将其设置为0.。
这是我经常写的一个基本操作,我想研究最短,最清晰的方法。到目前为止,这是我最好的:
v = (v == 0 ? 1 : 0);
你能改进吗?
编辑:问题是询问如何在保留清晰度的同时用最少的字符写上述语句 - 这怎么'不是真正的问题'?这并不是一场代码高尔夫练习,尽管一些有趣的答案已经出现在接近高尔夫的人们身上 - 很高兴看到高尔夫球以建设性和发人深省的方式使用。
答案 0 :(得分:702)
您可以简单地使用:
v = 1 - v;
这当然假设变量已正确初始化,即它只有0或1的值。
另一种较短但使用不太常见的运算符的方法:
v ^= 1;
要清楚;我从来没有把这个问题当作代码高尔夫,只是为了找到一个简单的方法来完成任务而不使用任何模糊的技巧,如操作员的副作用。
答案 1 :(得分:340)
由于0
为false
值,1
为true
值。
v = (v ? 0 : 1);
如果您愿意使用true
和false
代替数字
v = !v;
或者如果必须是数字:
v = +!v; /* Boolean invert v then cast back to a Number */
答案 2 :(得分:199)
v = (v + 1) % 2
如果您需要循环显示更多值,请更改2
(n + 1)
。假设你需要循环0,1,2只做v = (v + 1) % 3
。
答案 3 :(得分:75)
你可以为它编写一个函数并使用它:
v = inv(v)
答案 4 :(得分:50)
如果你不关心1:
以外的任何可能性v = v ? 0 : 1;
在上述情况下,如果v为0,则为v,最终为1,false,undefined或null。使用这种方法要小心 - 即使v是“hello world”,v也会为0.
答案 5 :(得分:44)
v = 1 - v
或v ^= 1
或v= +!v
之类的行都可以完成工作,但它们构成了我所说的黑客行为。这些代码并不是很漂亮,但却有一些廉价的技巧可以产生预期的效果。 1 - v
无法通信“切换0到1之间的值”。这使得您的代码不那么具有表现力,并引入了一个地方(虽然很小),其他开发人员将不得不解析您的代码。
改为像v = toggle(v)
这样的函数以最快的速度传达意图。
答案 6 :(得分:40)
答案 7 :(得分:35)
你可以做到
v = Math.abs(--v);
减量将值设置为0或-1,然后Math.abs
将-1转换为+1。
答案 8 :(得分:34)
通常,只要您需要在两个值之间切换,就可以从两个切换值的总和中减去当前值:
0,1 -> v = 1 - v 1,2 -> v = 3 - v 4,5 -> v = 9 - v
答案 9 :(得分:33)
如果它必须是整数1或0,那么你正在做的方式很好,虽然不需要括号。如果将这些a用作布尔值,那么你可以这样做:
v = !v;
答案 10 :(得分:23)
v = v == 0 ? 1 : 0;
够了!
答案 11 :(得分:18)
我想提出三种解决方案。所有这些都将任何值转换为0
(如果1
,true
等)或1
(如果0
,false
,{{ 1}}等等):
null
v = 1*!v
v = +!v
还有一个,已经提到,但又聪明又快(虽然只适用于v = ~~!v
和0
s):
1
您可以使用以下解决方案:
v = 1-v
这将首先将整数转换为相反的布尔值(v = 1*!v
到0
,将任何其他值转换为True
),然后在乘以{{1}时将其视为整数}。因此,False
将转换为1
,将任何其他值转换为0
。
作为证据,请参阅此jsfiddle并提供您要测试的任何值:jsfiddle.net/rH3g5/
结果如下:
1
将转换为整数0
,-123
将转换为整数0
,-10
将转换为整数0
,-1
将转换为整数0
,0
将转换为整数1
,1
将转换为整数0
,2
将转换为整数0
,正如mblase75所说,jAndy有一些其他解决方案可以作为我的解决方案:
60
它还首先从原始值创建布尔值,但使用0
而不是v = +!v
将其转换为整数。结果完全相同,但符号更短。
另一种方法是使用+
运算符:
1*
这是非常罕见的,总是从布尔值转换为整数。
答案 12 :(得分:17)
总结另一个答案,评论和我自己的意见,我建议结合两件事:
这是您可以放在库中的函数,也可以将其包装在另一个Javascript Framework的插件中。
function inv(i) {
if (i == 0) {
return 1
} else {
return 0;
}
}
用法很简单:
v = inv(v);
优点是:
答案 13 :(得分:13)
我不知道你为什么要建立自己的布尔?我喜欢时髦的语法,但为什么不编写可理解的代码?
这不是最短/最快,但最清晰(并且对所有人都可读)使用众所周知的if / else状态:
if (v === 0)
{
v = 1;
}
else
{
v = 0;
}
如果你想要非常清楚,你应该使用布尔而不是数字。对于大多数情况,它们足够快。使用布尔值,您可以使用这种语法,这将在简短的情况下获胜:
v = !v;
答案 14 :(得分:12)
原始解决方案的另一种形式:
v = Number(v == 0);
编辑:感谢TehShrike和Guffa指出原始解决方案中的错误。
答案 15 :(得分:11)
我会更明确地说明。
v
是什么意思?
例如,当v是某种状态时。创建对象状态。在DDD中是一个值对象。
在此值对象中实现逻辑。然后,您可以使用更具可读性的更实用的方式编写代码。可以通过基于当前状态创建新状态来完成切换状态。然后将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);
答案 16 :(得分:10)
另一种方法:
v = ~(v|-v) >>> 31;
答案 17 :(得分:10)
缺少这个:
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 ...
或者
v = {0: 1, 1: 0}[v];
最后一个解决方案的魅力,它也适用于所有其他值。
v = {777: 'seven', 'seven': 777}[v];
对于一个非常特殊的情况,比如获得(更改)值和undefined
,这种模式可能会有所帮助:
v = { undefined: someValue }[v]; // undefined someValue undefined someValue undefined ...
答案 18 :(得分:8)
只是为了踢:v = Math.pow(v-1,v)
也在1到0之间切换。
答案 19 :(得分:7)
还有一个:
v=++v%2
(在C中它很简单++v%=2
)
PS。是的,我知道它是双重赋值,但这只是C的方法的原始重写(它不能正常工作,因为JS预增量运算符不会返回左值。
答案 20 :(得分:7)
如果您保证输入为1或0,则可以使用:
v = 2+~v;
答案 21 :(得分:7)
定义一个数组{1,0},将v设置为v [v],因此值为0的v变为1,反之亦然。
答案 22 :(得分:7)
由于这是JavaScript,我们可以使用一元+
转换为int:
v = +!v;
这将NOT
v
的值true
v == 0
false
或v == 1
{{1}}。然后我们将返回的布尔值转换为相应的整数表示。
答案 23 :(得分:5)
另一种创造性的方式,v
等于任何值,将始终返回0
或1
v = !!v^1;
答案 24 :(得分:4)
如果v的可能值仅为0和1,则对于任何整数x,表达式为: v = Math.pow((Math.pow(x,v) - x),v); 将切换值。
我知道这是一个丑陋的解决方案而且OP并没有寻找这个......但是当我在厕所时,我正在考虑另一个解决方案:P
答案 25 :(得分:3)
未经测试,但如果您使用布尔值,我认为var v = !v
将起作用。
参考:http://www.jackfranklin.co.uk/blog/2011/05/a-better-way-to-reverse-variables
答案 26 :(得分:3)
v=!v;
适用于v = 0和v = 1;并切换状态;
答案 27 :(得分:1)
如果只有两个值,就像在这种情况下(0,1),我认为使用int是浪费的。而是选择布尔值并使用位。我知道我在假设但是如果在两个状态之间切换,布尔似乎是理想的选择。
答案 28 :(得分:1)
嗯,正如我们所知,在javascript中,只有布尔比较也会给你预期的结果。
即。 v = v == 0
就足够了。
以下是代码:
var v = 0;
alert("if v is 0 output: "+ (v == 0) );
setTimeout(function(){
v = 1;
alert("if v is 1 Output: "+ (v == 0) );
}, 1000);
JSFiddle:https://jsfiddle.net/vikash2402/83zf2zz0/
希望这会对您有所帮助:)
答案 29 :(得分:0)
v =数字(!v)
它将类型转换后的布尔值转换为Number,这是所需的输出。
答案 30 :(得分:-2)
v = !v * 1
乘以1将布尔值转换为数字