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

Oll*_*ass 462 javascript variables coding-style toggle

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

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

v = (v == 0 ? 1 : 0);
Run Code Online (Sandbox Code Playgroud)

你能改进吗?

编辑:问题是询问如何在保留清晰度的同时用最少的字符写上述语句 - 这怎么'不是真正的问题'?这不是一个代码高尔夫练习,虽然一些有趣的答案来自人们接近它作为高尔夫球 - 很高兴看到高尔夫球以建设性和发人深省的方式使用.

Guf*_*ffa 713

你可以简单地使用:

v = 1 - v;
Run Code Online (Sandbox Code Playgroud)

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

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

v ^= 1;
Run Code Online (Sandbox Code Playgroud)

编辑:

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

  • 这些都是美丽的代码,如精细切割的玻璃或罕见的开花兰花.我喜欢你如何直接通过逻辑层直接处理1和0的数学运算,并且可以进行最优化的操作.我将在我自己的项目中使用这些,但不幸的是,当我需要同事理解代码时,我将不得不默认采用更基于逻辑的方法.谢谢你,你的答案已经成为我的一天. (206认同)
  • 如果你通过写这个来保存15个字符但是然后使用40个字符的注释来解释它,它真的是一个改进吗? (80认同)
  • @Matthew说,如果没有找到'v ^ = 1`的人应该停止编程我认为有点苛刻.如前所述,它不是更常见的运算符之一,它与`v = v ^ 1`的功能不同.运算符也意味着在不同语言(VB)中完全不同的东西.是的,快速查找将告诉您它是一个XOR操作符,您将了解它的作用,但对许多人来说,乍一看可能并不明显.我认为这并不意味着你需要辞掉工作. (50认同)
  • 您始终可以添加注释,说明代码的作用. (37认同)
  • @Kevin:这显然不能回答问题.q说"我想在0和1之间切换变量".一个非常合理的解释是,这意味着变量的值已经是0或1.这个解释/限制在答案中是明确的.世界上你能反对什么? (25认同)
  • 'v ^ = 1`为+1.如果还不清楚那么我认为你应该停止编程并稍微练习逻辑运算的基础知识.`v = 1 - v`很聪明,但不是很清楚,因为它不是一个逻辑操作.用逻辑而不是数学表示逻辑要好得多. (23认同)
  • 任何不明白这段代码的人*都不是程序员*.如果非程序员因阅读此代码而感到困惑,那么问题在于非程序员正在阅读您的代码. (14认同)
  • @KevinDTimm:也许它没有回答你对这个问题的解释,但它似乎回答了对这个问题的解释...... (9认同)
  • @Lotus注意:不,并非每个程序员都必须立即了解所有代码.你必须能够期望一定程度的知识,否则你的所有代码最终都会看起来像"Javascript for Dummies"...... (9认同)
  • @Ian Boyd:这不是介于0和1之间.同样,我在答案中明确指出了方法的局限性. (7认同)
  • @JohnIsaacks`v ^ = 1`和`v = v ^ 1`完全相同,就像`v + = 1`和`v = v + 1`是相同的.至少,单个线程的结果是相同的; 可能存在语言/实现,其中中间值以不同方式处理. (6认同)
  • @Ian Boyd:那么"逻辑"是什么意思呢?你的意思是问题中的代码,还是规范(第一句)?我选择了规范而不是代码,我在答案中明确说明了方法的局限性. (5认同)
  • 什么样的程序员不理解逻辑运算符? (5认同)
  • @Lotus注意:你看不出它的作用?好吧,不是每个人都能看到问题中代码的作用. (4认同)
  • @KevinDTimm 1 - 0 = 1 (3认同)
  • @Chuck van der Linden:你总是假设某些条件符合代码才能工作,不管条件如何,都不可能编写能够做到理智的代码.例如,为'v`创建一个对象很容易,所以即使`v == 0`也不行... (3认同)
  • 除了模糊逻辑的意图之外,您还通过更改逻辑引入了一个错误. (2认同)
  • @迈克尔迈尔斯,我认为这仍然是一个进步.读者可以看到正在发生的事情,它可能只是让他们的一天看到像这样的东西.昆汀在下面的回答可能更清楚,但这仍然很漂亮. (2认同)
  • @Michael Myers是的,这是一个改进,15个字符的代码意味着15个字符的错误机会少.评论不可执行(通常;)) (2认同)
  • @Noon Silk:你说它太可怕了,但没有说明原因."它太可怕了"通常不被认为是"推理"的一个downvote. (2认同)
  • @Chuck van:"这当然假定......"使假设明确,​​这远比未说明的假设好.根据明确的假设,您可以就代码是否满足您的需求做出明智的决定. (2认同)
  • @Nathanael:使用`v ^ = 0;`不会改变变量的值.`^ =`运算符执行按位xor,并且`x xor 0 == x`.使用`v ^ = 1;`执行值为1的xor,从而在v和0之间翻转v中的第一位. (2认同)
  • @ think123:`v ^ = 1;`与`v = v ^ 1`相同.它是独家或运营商.请参阅:http://msdn.microsoft.com/en-us/library/0zbsw2z6%28v=VS.80%29.aspx (2认同)

Que*_*tin 342

因为0是一个false值而且1是一个true值.

v = (v ? 0 : 1);
Run Code Online (Sandbox Code Playgroud)

如果您乐意使用truefalse不是数字

v = !v;
Run Code Online (Sandbox Code Playgroud)

或者如果它们必须是数字:

v = +!v; /* Boolean invert v then cast back to a Number */
Run Code Online (Sandbox Code Playgroud)

  • 只需把魔术`+`放在那个`!`之前.哦,看起来太脏了!但很酷:p (55认同)
  • 笑一笑:`({v:+!v}).v`. (34认同)
  • @Brian:没有那个神奇的`+`符号!¯\\ _(ツ)_ /¯ (17认同)
  • "v =(v?0:1)"的+1为清晰而惯用的JS. (11认同)
  • @Maxim — 这是 JavaScript(请参阅问题上的标签)。我的答案中的评论解释了它是如何工作的。[一元加运算符](https://developer.mozilla.org/en/JavaScript/Reference/Operators/Arithmetic_Operators) 转换为数字。 (2认同)

Pru*_*sse 200

v = (v + 1) % 2如果你通过更多的值需要周期只是改变2(n + 1).假设你需要循环0,1,2就行了v = (v + 1) % 3.

  • +1用于将切换视为一个循环.简单考虑一下它的灵活性. (16认同)
  • +1用于提供同样强大的模块化解决方案.在实践中,您可能希望使用`const`变量代替幻数2,3,... (3认同)
  • 我喜欢这个循环!那真的很聪明. (2认同)
  • 更短(更黑客)的方式:`++ v%3`如果你想循环0,1,2 (2认同)

Dan*_*iel 75

你可以为它编写一个函数并使用它:

v = inv(v)

  • 为什么要将其缩写,称之为"反转"或"切换"并使代码可读.这并不是说我们试图将这些东西放到80柱打孔卡上. (51认同)
  • +1我非常同意这是最干净的解决方案(......但是`inv`函数会发生什么:P) (30认同)
  • @TehShrike你认为`inv`是一个描述性的名字吗? (11认同)
  • 我希望我能给出这个答案而不仅仅是+1.如果公共代码不明显,它应该包含在具有描述性名称的函数中. (4认同)
  • @Bennett McElwee:inv = invert.对我来说,似乎总是一个常见的缩写. (3认同)
  • @Chuck van der Linden:我刚刚建议使用`inv`,但如果你愿意的话,你可以使用`invert`或`toggle`.但是因为作者说他经常写这篇文章,所以我认为最好还是把它缩短.顺便说一句:这种行为经常被看到.例如,参见python的`len`来确定列表的长度. (2认同)

Bri*_*ian 50

如果你不关心1以外的任何可能性:

v = v ? 0 : 1;
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,如果v为0,false,undefined或null,则v将最终为1.使用这种方法要小心 - 即使v是"hello world",v也将为0.

  • @Guffa - +1用于捕捉我的阅读障碍... (3认同)
  • 这是我最喜欢的基于逻辑的答案,我可以与同事一起使用(我看到@ Guffa的答案是基于数字的).我喜欢你如何进行不必要的测试(v == 0)和括号,将其剥离到绝对最小字符数.谢谢. (3认同)
  • 这不会改变价值.你的意思是`v = v?0:1` (2认同)
  • +1用于理解"truthy"值. (2认同)

Ray*_*Ray 44

线条状v = 1 - v,或v ^= 1v= +!v将全部完成这项工作,但他们构成了什么,我会称之为黑客.这些代码并不是很漂亮,但却有一些廉价的技巧可以产生预期的效果.1 - v不通信"切换0和1之间的值".这使得您的代码不那么具有表现力,并引入了一个地方(虽然是一个小地方),其他开发人员将不得不解析您的代码.

相反,一个功能就像v = toggle(v)以最快的速度传达意图.

  • `1-v`可以确实交换切换,但这是它唯一的通信.例如,它还可以在"v = 1"处传递零线,或者以"v = 0.5"为中心传递镜像变换.在这个意义上,它是相对模糊的.确实,知道'v`只能是'0`或'1'限制了它的预期含义,但这迫使其他开发人员(或你未来的自我)在能够理解这条简单的线之前理解该上下文.你不能比'v = toggle(v)`更清楚 (22认同)
  • 如果您理解逻辑运算,那么`v ^ = 1`是非常清楚的,如果您是程序员,那么您会更好.我认为那是和'v = 1-v`之间的区别; 一个是逻辑运算,一个是算术运算,我们试图表示逻辑概念而不是数学概念. (10认同)
  • -1,严重的是,`v = 1-v`不通信切换? (8认同)
  • @Matthew阅读:这是一个很好的陈述,它总结了我的想法:"我们试图代表一个逻辑概念,而不是数学概念." 即使`v ^ = 1`也有一些歧义,因为它可以被解释为bitwise-xor. (6认同)
  • 对程序员来说(是的,我的意思是像我们这样的极客),这些都很清楚.它们不是黑客,因为它们的简单性是优雅的解决方案. (6认同)
  • v = 1-v的另一个问题是你对v的状态做了很多假设,这打破了某人用你没想到的v做某事的那一刻,但你永远不会知道它被打破了.如果v是除1或0之外的任何东西,切换函数也可以抛出异常,因此它也可以"保护"此变量的意图,而不是假设所有触摸此代码的人都将准确理解它是什么并正确对待它.因此,它可能会出错很多. (3认同)
  • 这个+1.问题谈到**清晰度**.当我读"v = 1-v"时,即使看起来如此聪明,聪明和优化,我也绝对不清楚.我个人主板上用Arial 80写的是什么:"优化前的可读性". (3认同)
  • 如果我看到'v = 1 - v`,我知道它的作用.如果我看到`v = toggle(v)`我知道它可能*做什么,如果程序员和我对"切换"这个词的含义有相同的想法,并且如果`toggle`的定义不是充满了虫子. (2认同)

Loo*_*ace 38

(诚实和数学完整性 - 考虑到这个"答案"的投票数量 - 让我编辑了这个答案.我尽可能长时间地停止,因为它只是为了一个简短的讽刺,而不是任何"深度",所以放入任何解释似乎都与目的相反.但是,这些评论清楚表明我应该清楚避免误解.)

我的原始答案:

本部分规范的措辞:

如果它为0,我想将其设置为1,否则将其设置为0.

意味着最准确的解决方案是:

v = dirac_delta(0,v)
Run Code Online (Sandbox Code Playgroud)

首先,坦白:我确实让我的delta函数感到困惑.Kronecker delta可能稍微合适一些,但不是很多,因为我想要一些与域无关的东西(Kronecker delta主要用于整数).但我真的不应该使用delta函数,我应该说:

v = characteristic_function({0},v)
Run Code Online (Sandbox Code Playgroud)

让我澄清一下.回想一下函数是三元组(X,Y,f),其中XY是集合(分别称为codomain),f是为X的每个元素分配Y元素的规则.我们经常将三元组(X,Y,f)写f:X→Y.给定的一个子集X,说,有一个特征函数是一个函数χ :X→{0,1} (它也可以作为一个功能来值域这种较大如ℕ或ℝ想到).此功能由规则定义:

χ (X)= 1如果X∈Aχ (X)= 0,如果X∉甲.

如果你喜欢真值表,那么问题的真值表是" X的元素x是子集A的元素吗?".

因此,根据这个定义,很明显特征函数就是这里所需要的,其中X一个包含0和A = {0}的大集合.这就是我应该写的.

三角函数也是如此.为此,我们需要了解集成.要么你已经知道了,要么你不知道.如果你不这样做,我在这里所说的任何内容都不会告诉你这个理论的复杂性,但我可以给出一个句子的总结.一个度量一组X在本质上是"那哪是让平均工作需要".这就是说,如果我们有一组X和措施μ上设置,那么有一类的功能X→ℝ,呼吁测函数该表达式X ˚Fdμ是有道理的,并且,在一些模糊的感觉, "平均"的˚FX.

给定集合上的度量,可以为该集合的子集定义"度量".这是通过为子集分配其特征函数的积分(假设这是可测量的函数)来完成的.这可以是无限的,也可以是未定义的(两者略有不同).

周围有很多措施,但这里有两个很重要.一个是实线上的标准尺度,ℝ.对于这一措施,那么 ˚Fdμ是相当多的,你在学校里得到什么教(微积分是在学校还是教授):总结小矩形,并采取小的宽度.在该度量中,间隔的度量是其宽度.点的度量为0.

另一个适用于任何集合的重要指标称为点测量.它被定义为函数的积分是其值的总和:

X ˚Fdμ=Σ X∈X F(X)

该度量为每个单例集分配度量1.这意味着当且仅当它本身是有限时,子集具有有限度量.很少有函数具有有限积分.如果函数具有有限积分,则它必须仅在数的点数上为非零.因此,您可能知道的绝大多数函数在此度量下都没有有限积分.

现在是三角函数.我们来看一个非常广泛的定义.我们有一个可测量的空间(X,μ)(因此它是一个带有度量的集合)和一个元素a∈X.我们以"限定的" δ函数(取决于)为"功能" δ 一个:X→ℝ与该属性δ 一个(X)= 0,如果X≠一个X δ 一个 dμ= 1.

关于这一点的最重要的事实是:delta函数不一定是函数.这是正确的定义:我没有说什么δ (一)是.

你在这一点上所做的取决于你是谁.这里的世界分为两类.如果您是数学家,请说出以下内容:

好的,所以可能没有定义delta函数.让我们来看看它的假设性,看看我们是否能够找到合适的住所为它在那里它定义.我们可以做到这一点,我们最终得到了分布.这些不是(必然)函数,但是它们的功能与函数类似,通常我们可以像它们一样使用函数; 但是有一些他们没有的东西(比如"价值")所以我们需要小心.

如果您不是数学家,请说出以下内容:

好的,因此delta函数可能没有正确定义.谁这么说?一群数学家?别理他们!他们知道什么?

现在冒犯了我的观众,我会继续.

狄拉克δ通常取为与它的标准度量实线上的点(通常0)的δ函数.因此,那些在评论中抱怨我不知道我的增量的人正在这样做,因为他们正在使用这个定义.对他们来说,我道歉:虽然我可以通过使用数学家的防御(由Humpty Dumpty推广:简单地重新定义一切以使其正确)来摆脱它,但使用标准术语来表示不同的东西是不好的形式.

但是,它确实做我想做的事情增量功能,那就是我需要在这里.如果我采取点措施上的一组X一个真正的函数δ 一个:X→ℝ满足为δ函数的标准.这是因为我们正在寻找一个函数X→ℝ,它除了在a和所有值的总和为1 之外为零.这样的函数很简单:唯一缺失的信息是它在a值,并且要求总和为1,我们只需为其赋值1.这是{a}上的特征函数.然后:

X δ 一个 dμ=Σ 的x∈X δ 一个(X)=δ 一个的(a)= 1.

因此,在这种情况下,对于单例集,特征函数和delta函数一致.

总之,这里有三个"功能"系列:

  1. 单身集的特征函数,
  2. delta函数,
  3. Kronecker delta函数.

其中第二个是最一般的,因为在使用点测量时,其他任何一个都是它的一个例子.但第一和第三的优势在于它们始终是真正的功能.对于特定的域族(整数或其某个子集),第三个实际上是第一个的特例.

所以,最后,当我最初写我的回答并没有想正常(我不会走那么远,说我糊涂,我希望我刚刚证明我知道我在说什么时候我实际上先想到,我只是没有想太多).狄拉克三角洲的通常含义不是这里想要的,但我回答的一点是输入域没有被定义,所以Kronecker delta也不是正确的.因此,最好的数学答案(我的目标)将是特征函数.

我希望这一切都清楚; 而且我也希望我再也不用使用HTML实体而不是TeX宏来编写数学作品!

  • +1 - 如果我因为不知道dirac_delta函数而忘记Quentin我会.我想知道他去过哪所大学,因为如果他们甚至不知道对数字处理有根本性的东西,我不认为我会雇佣任何人.我会进一步低估昆汀,因为他无法掌握你所尝试的幽默. (36认同)
  • 如果我低估了每一个答案,我都不理解......我会贬低很多答案. (22认同)
  • 你好安德鲁,已经有一段时间了. (4认同)
  • @Tim:好悲伤,所以它有!百慕大主教怎么样?(我记得是吗?)我猜这个评论帖不是最好的追赶的地方,但是...... 17年,不是吗? (4认同)
  • @Cԃաԃ"这个答案失败了......"*叹气*.你确实读过我是数学家,不是吗?这个答案非常适合真空中的球形程序员,所以我不知道你在抱怨什么. (3认同)
  • 给我一些新的东西+1.我不知道什么是迪拉克三角洲...现在我做:)我喜欢stackoverflow! (2认同)

Pau*_*aul 35

你可以做到

v = Math.abs(--v);
Run Code Online (Sandbox Code Playgroud)

递减将值设置为0或-1,然后Math.abs将-1转换为+1.

  • 这已经变成了"生成10000种做简单任务的方式"的竞争.我喜欢哈哈的所有方式. (27认同)
  • `v = Math.round(Math.sin(Math.PI /(v + 3)));` (27认同)
  • @Benoit - 对于v = 0和v = 1,您的公式等于1.**这个**虽然是正确的!`v = Math.round(Math.cos(Math.PI /((v*2 + 1)+2)-2*v));`:D (15认同)
  • 我也喜欢他们,哈哈! (2认同)
  • 这永远不会改变价值.如果`v = 1`则`v = Math.Abs​​(-1)`即+1.如果`v = 0`则`v = Math.Abs​​(-0)`为0. (2认同)

Mou*_*hna 34

通常,只要需要在两个值之间切换,就可以从两个切换值的总和中减去当前值:

    0,1 -> v = 1 - v
    1,2 -> v = 3 - v
    4,5 -> v = 9 - v 
Run Code Online (Sandbox Code Playgroud)

  • @oosterwal:当然问题在于腐败...... (3认同)
  • 这很有趣,很有创意,但有潜在危险.如果`v`被破坏,它将突然开始在两个不同的值之间切换.(只是考虑一下......) (2认同)

Mic*_*ski 33

如果它必须是整数1或0,那么你正在做的方式很好,虽然不需要括号.如果将这些a用作布尔值,那么你可以这样做:

v = !v;
Run Code Online (Sandbox Code Playgroud)

  • 是的,我会在代码行上方的句子中警告._如果这些a用作布尔值_ (12认同)
  • 这不会导致Ollie的"v"被设置为布尔结果,而不是整数吗? (10认同)

nid*_*hin 23

v = v == 0 ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)

足够 !

  • @Brian:'更好'实际上是关于意见. (16认同)
  • @Brian:"*答案*"是*"不,没有更好的写作方式`v =(v == 0?1:0);`"*.其他人都在寻找不同的打高尔夫球的方式; 并没有真正回答这个问题.这就是我投票给这个答案的原因. (9认同)
  • 更多的意见而不是答案,你不觉得吗? (7认同)
  • 我喜欢你如何取出括号 - 将几个角色剪掉! (3认同)

Tad*_*eck 19

解决方案清单

我想提出三种解决方案.所有这些转换为任意值0(如1,true等)或1(如果0,false,null等):

  • v = 1*!v
  • v = +!v
  • v = ~~!v

还有一个,已经提到,但聪明又快(虽然只适用于0s和1s):

  • v = 1-v

解决方案1

您可以使用以下解决方案:

v = 1*!v
Run Code Online (Sandbox Code Playgroud)

这将第一转换整数到相对的布尔型(0True及任何其他值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
Run Code Online (Sandbox Code Playgroud)

它还首先从原始值生成布尔值,但使用+而不是1*将其转换为整数.结果完全相同,但符号更短.

解决方案3

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

v = ~~!v
Run Code Online (Sandbox Code Playgroud)

它非常罕见,总是从布尔值转换为整数.


Mar*_*eit 17

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

  1. 使用切换功能
  2. 在此函数内部使用更易读的实现

这是您可以放在库中的函数,也可以将其包装在另一个Javascript Framework的插件中.

function inv(i) {
  if (i == 0) {
    return 1
  } else {
    return 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

用法很简单:

v = inv(v);
Run Code Online (Sandbox Code Playgroud)

优点是:

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

  • 7.5ns vs 8.8ns.额外的1.3纳秒真的会杀了你. (25认同)
  • 随着我一直保存,我把我的家人带到了迪士尼乐园!:-) (5认同)
  • 缺点:功能很慢 (2认同)

Mar*_*nol 13

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

这不是最短/最快的,但最清晰(并且对所有人都可读)是使用众所周知的if/else状态:

if (v === 0)
{
  v = 1;
}
else
{
  v = 0;
}
Run Code Online (Sandbox Code Playgroud)

如果你想要非常清楚,你应该使用布尔而不是数字.对于大多数情况,它们足够快.使用布尔值,你可以使用这种语法,它将在短时间内获胜:

v = !v;
Run Code Online (Sandbox Code Playgroud)

  • 是否有价值无声地纠正像7这样的输入而不是抛出某种异常?我的意思是,如果其他一些代码在你的代码更正了值之前,它只是在期望0或1的情况下得到了7的代码? (4认同)

Kur*_*lor 12

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

v = Number(v == 0);
Run Code Online (Sandbox Code Playgroud)

编辑:感谢TehShrike和Guffa指出我原始解决方案中的错误.

  • ==运算符在许多系统下返回一个布尔值(而不是整数).这只有在v被定义为整数时才有效,并且语言很酷,自动从布尔转换为整数. (4认同)

Mar*_*rco 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);
Run Code Online (Sandbox Code Playgroud)

  • 过度工程? (6认同)
  • +1让我开怀大笑 (6认同)

Eng*_*uad 10

另一种方法:

v = ~(v|-v) >>> 31;
Run Code Online (Sandbox Code Playgroud)


Nin*_*olz 10

缺少这个:

v = [1, 0][v];
Run Code Online (Sandbox Code Playgroud)

它也可以作为循环法:

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 ...
Run Code Online (Sandbox Code Playgroud)

要么

v = {0: 1, 1: 0}[v];
Run Code Online (Sandbox Code Playgroud)

最后一个解决方案的魅力,它也适用于所有其他值.

v = {777: 'seven', 'seven': 777}[v];
Run Code Online (Sandbox Code Playgroud)

对于一个非常特殊的情况,比如获取(更改)值undefined,这种模式可能会有所帮助:

v = { undefined: someValue }[v]; // undefined someValue undefined someValue undefined ...
Run Code Online (Sandbox Code Playgroud)

  • 那太棒了! (2认同)

Bla*_*ger 8

只是为了踢:v = Math.pow(v-1,v)也在1到0之间切换.


0x4*_*2D2 8

由于这是JavaScript,我们可以使用一元+转换为int:

v = +!v;
Run Code Online (Sandbox Code Playgroud)

这将逻辑NOTv(给人true如果v == 0falsev == 1).然后我们将返回的布尔值转换为相应的整数表示.


Ada*_*zyk 7

多一个: v=++v%2

(在C中它会很简单++v%=2)

PS.是的,我知道它是双重赋值,但这只是C的方法的原始重写(它不能正常工作,因为JS预增量运算符不会返回左值.

  • 你的C版本是非法的; 你不能修改`++`运算符的结果(它不是左值).对于`v = ++ v%2`,你要修改`v`两次.我不知道这是否在JavaScript中得到了很好的定义,但它没有必要.`v =(v + 1)%2`. (3认同)
  • +1.可写为v =(v + 1)%2. (3认同)

小智 7

如果您保证您的输入是1或0,那么您可以使用:

v = 2+~v;
Run Code Online (Sandbox Code Playgroud)


S..*_*S.. 7

定义一个数组{1,0},将v设置为v [v],因此值为0的v变为1,反之亦然.


Yan*_*hon 5

这样做的另一种创造性方式,即v等于任何价值,总会返回01

v = !!v^1;
Run Code Online (Sandbox Code Playgroud)

  • @Alex:`!!`将投给一个布尔.`!!(1)=== true`和`!!(0)=== false` (10认同)
  • 两个`!!`在逻辑数学中没有任何结果,你可以把'!!!!'放在那里并且会相同,但会产生4个不必要的操作 (3认同)

小智 5

如果 v 的可能值只有 0 和 1,则对于任何整数 x,表达式: v = Math.pow((Math.pow(x, v) - x), v); 将切换值。

我知道这是一个丑陋的解决方案,而 OP 并不是在寻找这个……但是当我在厕所时,我正在考虑另一个解决方案:P