有没有更好的写v =(v == 0?1:0)的方法;

时间:2011-08-02 11:22:55

标签: javascript variables coding-style toggle

我想在0和1之间切换变量。如果它是0我想将其设置为1,否则如果它是1我想将其设置为0.。

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

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

你能改进吗?

编辑:问题是询问如何在保留清晰度的同时用最少的字符写上述语句 - 这怎么'不是真正的问题'?这并不是一场代码高尔夫练习,尽管一些有趣的答案已经出现在接近高尔夫的人们身上 - 很高兴看到高尔夫球以建设性和发人深省的方式使用。

31 个答案:

答案 0 :(得分:702)

您可以简单地使用:

v = 1 - v;

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

另一种较短但使用不太常见的运算符的方法:

v ^= 1;

编辑:

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

答案 1 :(得分:340)

由于0false值,1true值。

v = (v ? 0 : 1);

如果您愿意使用truefalse代替数字

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 - vv ^= 1v= +!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(如果1true等)或1(如果0false,{{ 1}}等等):

  • null
  • v = 1*!v
  • v = +!v

还有一个,已经提到,但又聪明又快(虽然只适用于v = ~~!v0 s):

  • 1

解决方案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

解决方案2

正如mblase75所说,jAndy有一些其他解决方案可以作为我的解决方案:

60

它还首先从原始值创建布尔值,但使用0而不是v = +!v 将其转换为整数。结果完全相同,但符号更短。

解决方案3

另一种方法是使用+运算符:

1*

这是非常罕见的,总是从布尔值转换为整数。

答案 12 :(得分:17)

总结另一个答案,评论和我自己的意见,我建议结合两件事:

  1. 使用切换功能
  2. 在此函数内部使用更易读的实现
  3. 这是您可以放在库中的函数,也可以将其包装在另一个Javascript Framework的插件中。

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

    用法很简单:

    v = inv(v);
    

    优点是:

    1. 无代码复制
    2. 如果您或任何人将来再次阅读此内容,您将在最短的时间内理解您的代码。

答案 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 falsev == 1 {{1}}。然后我们将返回的布尔值转换为相应的整数表示。

答案 23 :(得分:5)

另一种创造性的方式,v等于任何值,将始终返回01

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将布尔值转换为数字