是否有更好的书写方式v =(v == 0?1:0); [关闭]


465

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

这是一项非常基本的操作,我经常写这篇文章,希望研究出最短,最清晰的方法。到目前为止,这是我最好的:

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

您可以对此进行改进吗?

编辑:问题是询问如何用最少的字符写以上语句,同时保持清晰度-这是“不是一个真正的问题”吗?这样做并非旨在进行代码高尔夫练习,尽管人们从高尔夫运动中获得了一些有趣的答案-很高兴看到高尔夫以建设性和发人深省的方式使用。


20
对我来说,这看起来已经很简单/清晰/简短。
暴徒

136
骗术:v = +!v;
jAndy

48
如果“更好”也意味着“更快”:jsperf.com/v-0-1-0
pimvdb 2011年

7
@Mobinga:+1。这很简单,应该得到。我看到的所有其他答案令人困惑,其中一些改变了逻辑。引入错误。
伊恩·博伊德

8
@holodoc表达意见的更好解决方案是创建一个答案,说您认为原始的是最好的方法,并详细说明为什么会这样。这样还可以使其他人通过投票支持您的答案。
Chuck van der Linden

Answers:


721

您可以简单地使用:

v = 1 - v;

当然,这假定变量已正确初始化,即变量值仅为0或1。

另一种较短但使用较少通用运算符的方法:

v ^= 1;

编辑:

要清楚;我从来没有以代码高尔夫的方式来回答这个问题,只是为了找到一种完成任务的简短方法,而又不使用诸如操作员副作用之类的晦涩技巧。


206
这些是优美的代码行,例如精细切割的玻璃杯或稀有的开花兰花。我喜欢您如何直通逻辑层并以最佳操作直接处理1和0的数学问题。我将在自己的项目中使用它们,但是不幸的是,当我需要同事理解代码时,我将不得不默认使用更加基于逻辑的方法。不过,谢谢您,您的回答让我很开心。
奥利·格拉斯

37
您总是可以添加注释以说明代码的作用。
2011年

25
@凯文:这显然不能回答所提出的问题,这是不正确的。q表示“我想在0到1之间切换变量”。一个非常合理的解释是,这意味着变量的值已经是0或1。此解释/限制已在答案中明确说明。您会反对什么?
LarsH 2011年

50
@马修说,有人认为v ^= 1不清楚应该停止编程,我认为这有点苛刻。如前所述,它不是较常见的运算符之一,并且它与做不同的事情v = v ^ 1。另外,操作员用不同的语言(VB)表示完全不同的内容。是的,快速查找将告诉您它是XOR运算符,您将了解它的作用,但是对许多人来说乍一看可能并不明显。我认为这并不意味着您需要辞职。
JD Isaacks 2011年

80
如果您通过编写此代码节省了15个字符,然后使用40个字符的注释来说明它,那真的是一种改进吗?
迈克尔·迈尔斯

343

因为0是一个false价值,1是一个true价值。

v = (v ? 0 : 1);

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

v = !v;

或如果它们必须是数字:

v = +!v; /* Boolean invert v then cast back to a Number */

55
只是把魔术放在那+之前!。哦,看起来太脏了!但很酷:p
jAndy

1
@Quentin -这将打破家伙的代码,如果他有switch(v){ case 0 ...,或者(V == 0),或者如果V === 0。你改变他的结果,除了他的做法....
布赖恩

34
做它的一个笑脸:({v :+! v}).v
pimvdb

17
@布赖恩:不具有魔术+标志!¯\ _(ツ)_ /¯
jAndy

11
+1为v = (v ? 0 : 1)清晰,惯用的JS。
Bennett McElwee

200

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


2
我喜欢这个周期!那真的很聪明。
奥利·格拉斯

16
+1可将切换视为循环。简单考虑一下它的灵活性。
Guffa

3
+1用于提供功能强大的模块化解决方案。在实践中,您可能希望使用const变量代替幻数2、3,...
oosterwal

2
更短(更骇人)的方式:++v % 3如果您想循环浏览0、1、2
haraldmartin

75

您可以为它编写一个函数并像下面这样使用它:

v = inv(v)


30
+1我坚决认为这是最干净的解决方案(...但随后inv功能:P起作用了)
Lea Hayes

4
我希望我能给的答案不仅仅是+1。如果通用代码不是显而易见的,则应将其包装在具有描述性名称的函数中。
2011年

11
您认为@TehShrike inv是描述性名称吗?
Bennett McElwee,

3
@Bennett McElwee:inv =反转。在我看来,Always总是一个普通的缩写。
丹尼尔(Daniel)

51
为什么要缩写它,然后称其为“ invert”或“ toggle”,并使代码可读。这并不是说我们试图将这些东西安装到80列打孔卡上。
Chuck van der Linden

50

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

v = v ? 0 : 1;

在上述情况下,如果v为0,false,undefined或null,则v最终将为1。使用这种方法要小心-即使v是“ hello world”,v也会为0。


2
那不会翻转价值。你是说v = v ? 0 : 1
2011年

3
@Guffa-+1抓住了我的阅读障碍...
Brian

3
这是我最喜欢的基于逻辑的答案,可以与同事一起使用(我将@Guffa的答案视为基于数字的答案)。我喜欢您进行不必要的测试(v == 0)并将其括起来,将其剥离到绝对最小字符数的方式。谢谢。
奥利·格拉斯

1
我也是@Guffa答案的忠实拥护者-用lynard skynard的话说,保持简单;)
Brian

2
+1用于理解“真实”的值。
zzzzBov 2011年

44

线条状v = 1 - v,或v ^= 1v= +!v这样的代码行都可以完成工作,但是它们构成了我称为hack的内容。这些不是漂亮的代码行,而是可以达到预期效果的廉价技巧。1 - v不传达“在0和1之间切换值”。这使您的代码表达能力降低,并引入了另一个开发人员必须解析您的代码的地方(尽管很小)。

取而代之的是具有类似功能v = toggle(v)的内容,以便尽早传达意图。


8
-1,认真地讲,v=1-v没有传达切换键吗?
Blindy

22
1-v确实可以沟通,但那是它唯一能传达的信息。例如,它还可以传达在处具有零的线v=1或以处为中心的镜像变换v=0.5。从这个意义上讲,它是相对模糊的。的确,知道这v只能成为01限制其预期的含义,但是这迫使其他开发人员(或您将来的自己)必须先了解该上下文,然后才能理解这条简单的路线。您再清楚不过了v = toggle(v)

10
v ^= 1但是,如果您了解逻辑运算,则非常清楚,如果您是程序员,则最好这样做。我认为那是和之间的区别v=1-v。一个是逻辑运算,一个是算术运算,我们试图表示一个逻辑概念,而不是数学概念。
马修(Matthew)

6
@Matthew Read:这是一个很好的陈述,很好地总结了我的想法:“我们试图代表一个逻辑概念,而不是数学概念。” v ^= 1但是,甚至甚至有一些歧义,因为它可以解释为按位异或。

6
对于程序员(是的,我的意思是像我们一样的极客),这些非常清楚。它们不是骇客,因为它们的简单性是一种优雅的解决方案。
gion_13 2011年

38

出于对这个“答案”的投票数,诚实和数学上的正直使我编辑了这个答案。我之所以推迟了尽可能长的时间,是因为这只是一个简短的讽刺,而不是任何“深入”的内容,因此请输入任何解释似乎都与目的相反。但是,评论清楚表明我应该清楚避免误解。

我的原始答案:

规范这部分的措辞:

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

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

v = dirac_delta(0,v)

首先,告白:我确实使我的delta函数感到困惑。Kronecker增量本来应该更合适一些,但并不是我想要的与域无关的东西(Kronecker增量主要用于整数)并不足够。但是我真的不应该使用增量函数,我应该说:

v = characteristic_function({0},v)

让我澄清一下。回想一下,函数是一个三元组(X,Y,f),其中XY是集合(分别称为和共),而f是将Y的元素分配给X的每个元素的规则。我们通常将三元组(X,Y,f)写f:X→Y。给定X的子集(例如A),存在一个特征函数,它是函数χ:X→{0,1}(也可以认为是更大的共域函数(例如ℕ或ℝ)的函数)。该函数由以下规则定义:

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

如果您喜欢真值表,则它是问题“ X的元素x是子集A的元素吗?” 的真值表。

因此,从这个定义可以明显看出,这里需要特征函数,其中X包含0和A = {0}的某个大集合。那是我应该写的。

以此类推。为此,我们需要了解集成。您要么已经知道,要么不知道。如果您不这样做,那么我在这里什么也不能告诉您理论的复杂性,但是我可以给您一个句子的摘要。本质上,对集合X的度量是“使平均值起作用所需的度量 ”。这就是说,如果我们有一组X和措施μ上设置,那么有一类的功能X→ℝ,呼吁测函数该表达式X ˚Fdμ是有道理的,并且,在一些模糊的感觉,fX上的“平均值” 。

给定一个集合上的度量,就可以为该集合的子集定义一个“度量”。这是通过向子集分配其特征函数的积分来完成的(假定这是可测量的函数)。这可以是无限的,也可以是不确定的(两者有细微的差别)。

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

适用于任何集合的另一个重要度量称为点度量。定义函数的积分是其值的总和

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

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

现在到增量功能。让我们进行非常广泛的定义。我们有一个可测量的空间(X,μ)(所以这是一个带有度量的集合)和一个元素a∈X。我们以“限定的” δ函数(取决于)为“功能” δ 一个:X→ℝ与属性,δ 一个(X)= 0,如果X≠一个X δ 一个 dμ= 1

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

此时您要做什么取决于您是谁。这里的世界分为两类。如果您是数学家,请说以下内容:

好的,因此可能未定义delta函数。让我们来看看它的假设性,看看我们是否能够找到合适的住所为它在那里它定义。我们可以做到这一点,最后得到分布。这些不是(不一定)函数,而是行为类似于函数的事物,通常我们可以像对待函数一样使用它们。但是有些东西是它们所没有的(例如“值”),因此我们需要小心。

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

好的,因此可能未正确定义增量功能。谁这么说 一堆数学家?别管他们!他们知道什么?

现在冒犯了我的听众,我将继续。

狄拉克δ通常取为与它的标准度量实线上的点(通常0)的δ函数。因此,那些在评论中抱怨我的人不知道我的三角洲正在这样做,因为他们正在使用此定义。对于他们,我深表歉意:尽管我可以通过使用数学家的防御方法来避免这种情况(由Humpty Dumpty推广:只需重新定义所有内容,使其正确无误),但使用标准术语来表示不同的含义是一种不好的形式。

但是,它确实做我想做的事情,它是我在这里需要一个δ函数。如果我采取点措施上的一组X一个真正的函数δ 一个:X→ℝ其满足用于delta函数的标准。这是因为我们正在寻找一个函数X→ℝ,它在a处除外,并且所有值的总和为1。该函数很简单:唯一丢失的信息是它在a值,并且要使总和为1,我们只需为其分配值1。这就是{a}上的特征函数。然后:

X δ 一个 dμ=Σ 的x∈X δ 一个(X)=δ 一个(A)= 1。

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

总之,这里有三个“功能”家族:

  1. 单例集的特征函数,
  2. 增量功能
  3. Kronecker增量功能。

其中第二个是最通用的,因为其他任何一个都是使用点测度时的一个示例。但是第一个和第三个具有的优点是它们始终是真正的功能。第三个实际上是第一个的特殊情况,对于特定的域家族(整数或它们的某个子集)。

所以,最后,当我最初写出答案时,我并没有正确地思考(我不会说我很困惑,因为我希望我已经证明我确实知道我在说什么实际上,我首先想到的是,我只是想的不多。狄拉克三角洲的通常含义是不是在这里想要的,但我的答案的要点之一是,输入域是没有定义,因此Kronecker符号也将不会是正确的。因此,最好的数学答案(我的目标是)是特征函数。

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


37
+1-如果我因不知道dirac_delta函数而对Quentin表示不满,那我会。我想知道他上的那所大学,因为如果他们甚至不了解数字处理的基础知识,我认为我不会从那里雇用任何人。我会进一步谴责昆汀,因为他无法掌握您尝试的幽默之处。
邓肯

23
如果我拒绝所有我不明白的答案...我会拒绝很多答案。
Seamus

4
你好安德鲁,已经有一段时间了。
蒂姆·唐

4
@Tim:太可悲了!百慕大的主教怎么样?(我还记得吗?)我想这个评论线程不是追赶的最佳地点,虽然... 17年了,不是吗?
安德鲁·斯泰西

3
@Cԃաԃ“这个答案失败了……” 叹息。您确实读过我是数学家,不是吗?这个答案非常适合真空中的球形编程器,所以我不知道您在抱怨什么。
安德鲁·斯泰西

35

你可以做

v = Math.abs(--v);

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


27
这已经变成了“生成10,000种完成简单任务的方法”的竞赛。我喜欢所有方式哈哈。
乔什(Josh)

27
v = Math.round(Math.sin(Math.PI/(v+3)));
Benoit

15
@Benoit-对于v = 0和v = 1,您的公式均等于1。是正确的! v = Math.round(Math.cos(Math.PI/((v*2+1)+2)-2*v));:D
Teo.sk,2011年

2
那永远不会改变价值。如果v = 1那么v = Math.Abs(-1)这是+1。如果v = 0那么v = Math.Abs(-0)为0。–
Paul

1
+1这是我的另一个人。
递归

34

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

    0,1 -> v = 1 - v
    1,2 -> v = 3 - v
    4,5 -> v = 9 - v 

2
这是有趣和创造性的,但有潜在危险。如果v损坏,它将突然开始在两个不同的值之间切换。(只需考虑一下...)
oosterwal,2011年

1
+1这个有趣的想法。并不是说OP或任何其他人实际上会在这种情况下使用它,而是这条信息应该永远存在于大脑中。
Shimmy Weitzhandler

3
@oosterwal:那么问题肯定出在腐败中……
GManNickG 2012年

@GManNickG:迟早会发生数据损坏,因此我们需要意识到未检测到数据的后果。如果v通常用于从三个或更多状态的列表中交替执行两个状态,则的损坏v可能导致程序交替执行两个完全不同的状态-这可能会导致意外的不良结果。从中学到的教训是: 始终对数据执行真实性检查。
oosterwal 2012年

33

如果它必须是整数1或0,尽管不需要括号,但您的操作方式也可以。如果将这些a用作布尔值,则可以执行以下操作:

v = !v;

10
这不会导致Ollie的“ v”设置为布尔值而不是整数吗?
布莱恩

12
是的,我会在代码行上方的句子中警告过这一点。如果将这些a用作布尔值
Michael Berkowski

23
v = v == 0 ? 1 : 0;

足够 !


7
您是不是发表意见而不是回答?
布莱恩

16
@Brian:“更好”实际上就是意见。
pimvdb

3
我喜欢您将括号取出的方式-这样可以减少几个字符!
奥利·格拉斯

9
@Brian:“ 答案 ”是“不,没有更好的书写方式v = (v==0 ? 1 : 0);。其他人正在寻找不同的打高尔夫球方式。并没有真正回答问题。这就是为什么我投票赞成这个答案。
伊恩·博伊德

19

解决方案清单

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

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

和另外一个(已经提到过),但又聪明又快速(尽管仅适用于0s和1s):

  • v = 1-v

解决方案1

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

v = 1*!v

这将首先将整数转换为相反的布尔值(0to True和其他任何值to 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

它很少见,总是从布尔值转换为整数。


在JavaScript中,可以给变量加上前缀+以将其转换为数字,因此+!v等同于您的解决方案(OP注释中的jAndy解决方案)。
Blazemonger,2011年

@ mblase75:是的,您是对的,当您尝试将布尔值转换为整数时,1*可以替换+为。我的答案中的其他所有内容均保持不变。jAndy的答案是正确的,但我的更为详细。我将他/她的解决方案添加到我的答案中。
塔德克2011年

@Tadeck +1是个好主意。
Shimmy Weitzhandler,2011年

17

为了总结另一个答案,评论和我自己的观点,我建议结合以下两点:

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

这是您可以放置​​在库中或者可以将其包装在另一个Javascript框架的插件中的函数。

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

用法很简单:

v = inv(v);

优点是:

  1. 没有代码重复
  2. 如果您或任何人以后再读一遍,您将在最短的时间内理解您的代码。

是吗 我进行了一个快速测试:jsperf.com/function-vs-no-function/2,看来差别不大。
Martin Schlagnitweit 2011年

25
7.5ns和8.8ns。额外的1.3纳秒会真正杀死您。
伊恩·博伊德

5
在所有的积蓄中,我带家人去了迪士尼世界!:-)
汤姆(Tom)

1
完全正确。编写“聪明”解决方案的人可能永远不必维护其他程序员的代码“宝石”
Avi

1
为什么不function toggle(i){ return i == 0 ? 1 : 0 }呢?
比利·穆恩

13

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

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

if (v === 0)
{
  v = 1;
}
else
{
  v = 0;
}

如果您想弄清楚,应该为此使用布尔值而不是数字。在大多数情况下,它们足够快。使用布尔值时,您可以只使用以下语法,这将在短时间内获胜:

v = !v;

1
这实际上是我的首选答案;但是三元运算符 vs if-else是一场神圣的战争,我不想点燃保险丝。就是说,我认为第一行应该是=== 0。使用的样本输入7,正确的输出是 0,但这将输出1
伊恩·博伊德

4
静默更正7之类的输入而不抛出某种异常是否有价值?我的意思是,如果在代码更正该值之前,其他一些代码只在预期0或1时才将代码放在7上呢?
Chuck van der Linden

12

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

v = Number(v == 0);

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


4
在许多系统中,==运算符返回一个布尔值(而不是整数)。只有将v定义为整数,并且语言从布尔型自动转换为整数时,这种语言才能发挥作用。
2011年

非常真实 我在javascript的上下文中回答了问题(如何标记问题)。
Kurt Kaylor 2011年

@Kurt Kaylor:Javascript是==运算符返回布尔值的系统之一,因此它与原始解决方案的功能不同。
Guffa

@Guffa:我利用了javascript是具有隐式类型转换的弱类型语言的事实(例如'0.0000'== 0,0 ==“”,false ==“”,false == 0,1 ==等等)。我可以以同样的方式使用返回的布尔值,因为我可以使用的值为0或1。尽量的整数,例如,在JavaScript控制台来评价“2 +真”,你会得到3
库尔特Kaylor

1
@Kurt Kaylor:这仅在您强制进行隐式转换的情况下有效。例如'opacity:'+true,尝试以opacity:true代替opacity:1
Guffa

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);

6
超过工程?
alejandro5042,

6
+1让我发笑
Denshi


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 ...

9

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

v = +!v;

这将使(给出if 或if )NOT的值符合逻辑。然后,我们将返回的布尔值转换为其相应的整数表示形式。vtruev == 0falsev == 1


8

仅用于踢球:v = Math.pow(v-1,v)也在1和0之间切换。


7

多一个: v=++v%2

(在C语言中这很简单++v%=2

ps。是的,我知道这是双重分配,但这只是对C方法的原始重写(按原样工作,因为JS预增量运算符未返回左值)。


3
您的C版本是非法的;您不能修改++运算符的结果(它不是左值)。至于v=++v%2,您正在修改v两次。我不知道在JavaScript中是否定义正确,但这不是必需的。 v = (v+1) % 2
基思·汤普森

至少在c++其中是-因为预增量运算符具有更高的优先级并修改了变量“就地”,因此可以将其用作左值。我认为JS的实现++无法将其视为左值:/是的,这是多余的,但是我试图展示另一种方法-已经发布了更好的解决方案:)
Adam Jurczyk

3
+1。可以写成v =(v + 1)%2。
niktrs 2011年


7

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


我的解决方案是正确的,如果您不喜欢,请写下原因。您的评论没有帮助。我的解决方案读取变量,而不是做出决定。这需要更少的CPU。
S..

5

v等于任何值的另一种创新实现方式将始终返回01

v = !!v^1;

3
两个!!结果在逻辑数学上什么都没有,您可以放在!!!!那里,将是相同的,但是会产生4个不需要的操作
Alex K

10
@Alex:!!会变成笨蛋。!!(1) === true!!(0) === false
nickf

1
@nickf:啊哈,所以我想v = Boolean(v^1)会提供更多信息,感谢您的解释-没考虑过演员表
Alex K

1
@Alex,“逻辑数学”?这就是为什么数学家是糟糕的程序员。不要误会我的意思;优秀的程序员也善于理解数学。但这与逻辑数学无关。这是一种语言构造,至少在Javascript中,只要给出任何表达式,!就可以将其转换为布尔值。添加另一个!将否定该布尔值。强制转换在这里是隐式的,最终结果有效。不需要-1。
Yanick Rochon

1
我根本不是数学家。您可以尝试一下,看看自己jsperf.com/javascript-boolean-test
Alex K

4

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

我知道这是一个丑陋的解决方案,OP并没有在寻找这个...但是当我在厕所时,我只是在考虑另一个解决方案:P



3
v=!v;

将适用于v = 0和v = 1;并切换状态;


1

如果只有两个值,例如在这种情况下(0,1),我相信使用int是浪费的。而是去布尔值并逐位工作。我知道我在假设,但在两个状态之间切换的情况下,布尔值似乎是理想的选择。


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/

希望这对您有帮助:)


这适用于切换值,但值不会在0和1之间切换,而是在true和之间切换false。您可以v == 0用来确定条件中变量的值,但是如果要使用值0或1,则需要使用类似v == 0 ? 0 : 1Number(v)来获取。(此外,您可以使用v = !v;true和之间切换false。)
Guffa

是的..谢谢:)
Vikash Pandey

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.