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)
要清楚; 我从来没有把这个问题当作代码高尔夫,只是为了找到一个简单的方法来完成任务,而不使用任何模糊的技巧,如操作员的副作用.
Que*_*tin 342
因为0
是一个false
值而且1
是一个true
值.
v = (v ? 0 : 1);
Run Code Online (Sandbox Code Playgroud)
如果您乐意使用true
而false
不是数字
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)
Pru*_*sse 200
v = (v + 1) % 2
如果你通过更多的值需要周期只是改变2
了(n + 1)
.假设你需要循环0,1,2就行了v = (v + 1) % 3
.
Dan*_*iel 75
你可以为它编写一个函数并使用它:
v = inv(v)
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.
Ray*_*Ray 44
线条状v = 1 - v
,或v ^= 1
或v= +!v
将全部完成这项工作,但他们构成了什么,我会称之为黑客.这些代码并不是很漂亮,但却有一些廉价的技巧可以产生预期的效果.1 - v
不通信"切换0和1之间的值".这使得您的代码不那么具有表现力,并引入了一个地方(虽然是一个小地方),其他开发人员将不得不解析您的代码.
相反,一个功能就像v = toggle(v)
以最快的速度传达意图.
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),其中X和Y是集合(分别称为域和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μ是有道理的,并且,在一些模糊的感觉, "平均"的˚F过X.
给定集合上的度量,可以为该集合的子集定义"度量".这是通过为子集分配其特征函数的积分(假设这是可测量的函数)来完成的.这可以是无限的,也可以是未定义的(两者略有不同).
周围有很多措施,但这里有两个很重要.一个是实线上的标准尺度,ℝ.对于这一措施,那么∫ ℝ ˚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函数一致.
总之,这里有三个"功能"系列:
其中第二个是最一般的,因为在使用点测量时,其他任何一个都是它的一个例子.但第一和第三的优势在于它们始终是真正的功能.对于特定的域族(整数或其某个子集),第三个实际上是第一个的特例.
所以,最后,当我最初写我的回答并没有想正常(我不会走那么远,说我糊涂,我希望我刚刚证明我不知道我在说什么时候我实际上先想到,我只是没有想太多).狄拉克三角洲的通常含义不是这里想要的,但我回答的一点是输入域没有被定义,所以Kronecker delta也不是正确的.因此,最好的数学答案(我的目标)将是特征函数.
我希望这一切都清楚; 而且我也希望我再也不用使用HTML实体而不是TeX宏来编写数学作品!
Pau*_*aul 35
你可以做到
v = Math.abs(--v);
Run Code Online (Sandbox Code Playgroud)
递减将值设置为0或-1,然后Math.abs
将-1转换为+1.
Mou*_*hna 34
通常,只要需要在两个值之间切换,就可以从两个切换值的总和中减去当前值:
Run Code Online (Sandbox Code Playgroud)0,1 -> v = 1 - v 1,2 -> v = 3 - v 4,5 -> v = 9 - v
Mic*_*ski 33
如果它必须是整数1或0,那么你正在做的方式很好,虽然不需要括号.如果将这些a用作布尔值,那么你可以这样做:
v = !v;
Run Code Online (Sandbox Code Playgroud)
nid*_*hin 23
v = v == 0 ? 1 : 0;
Run Code Online (Sandbox Code Playgroud)
足够 !
Tad*_*eck 19
我想提出三种解决方案.所有这些转换为任意值0
(如1
,true
等)或1
(如果0
,false
,null
等):
v = 1*!v
v = +!v
v = ~~!v
还有一个,已经提到,但聪明又快(虽然只适用于0
s和1
s):
v = 1-v
您可以使用以下解决方案:
v = 1*!v
Run Code Online (Sandbox Code Playgroud)
这将第一转换整数到相对的布尔型(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
,正如mblase75所指出的那样,jAndy有一些其他解决方案可以作为我的解决方案:
v = +!v
Run Code Online (Sandbox Code Playgroud)
它还首先从原始值生成布尔值,但使用+
而不是1*
将其转换为整数.结果完全相同,但符号更短.
另一种方法是使用~~
运算符:
v = ~~!v
Run Code Online (Sandbox Code Playgroud)
它非常罕见,总是从布尔值转换为整数.
Mar*_*eit 17
总结另一个答案,评论和我自己的意见,我建议结合两件事:
这是您可以放在库中的函数,也可以将其包装在另一个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)
优点是:
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)
Kur*_*lor 12
您原始解决方案的另一种形式:
v = Number(v == 0);
Run Code Online (Sandbox Code Playgroud)
编辑:感谢TehShrike和Guffa指出我原始解决方案中的错误.
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)
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)
由于这是JavaScript,我们可以使用一元+
转换为int:
v = +!v;
Run Code Online (Sandbox Code Playgroud)
这将逻辑NOT
值v
(给人true
如果v == 0
或false
当v == 1
).然后我们将返回的布尔值转换为相应的整数表示.
多一个:
v=++v%2
(在C中它会很简单++v%=2
)
PS.是的,我知道它是双重赋值,但这只是C的方法的原始重写(它不能正常工作,因为JS预增量运算符不会返回左值.
这样做的另一种创造性方式,即v
等于任何价值,总会返回0
或1
v = !!v^1;
Run Code Online (Sandbox Code Playgroud)
小智 5
如果 v 的可能值只有 0 和 1,则对于任何整数 x,表达式: v = Math.pow((Math.pow(x, v) - x), v); 将切换值。
我知道这是一个丑陋的解决方案,而 OP 并不是在寻找这个……但是当我在厕所时,我正在考虑另一个解决方案:P