为什么逻辑运算符(例如||,&&等)没有复合赋值运算符?


20

根据ECMA-262,第11.13部分,以下是复合赋值运算符的详尽列表:*= /= %= += -= <<= >>= >>>= &= ^= |=

据部分11.11,var c = a || b将会把a价值成c,如果ToBoolean(a)是真实的,将把b价值为c其他。这样,逻辑“或”通常用作合并运算符,例如

function (options) {
    options = options || {};
}

通常,使用合并来指定变量的默认值,如上所示:a = a || b

复合赋值运算符似乎||=很有用,它允许以更短,更简洁的方式编写上述代码:a ||= b。然而,它不存在(虽然*=+=和其它复合赋值运算符是)。

问题是,为什么?


2
我非常困惑%=运算符甚至存在。谁认为这是必要的?其中一些运算符似乎是错误的语言设计决策。
乔纳森·里奇

2
@JonathanRich:为什么没有%=?如果您将拥有这些赋值运算符中的任何一个,那么某些开发人员(如penartur)迟早会想知道为什么运算符比其他运算符“更平等”。
凯文·克莱恩

4
@JonathanRich加密技术极大地利用了模数。Furthemore,存在与算术其余算术赋值运算符所需的正交性(如果一个预期+=*=-=/=,为什么不%=工作?)。

4
@JonathanRich:当您有圆形物体并想要对其进行归一化时,例如angle %= 360vertexIndex %= numberOfVertices(对于封闭多边形的顶点列表),运算符会派上用场。
塞巴斯蒂安·内格拉苏斯

1

Answers:


12

一种可能的原因是逻辑运算符&&||具有“短路”行为。除非有必要,否则不会评估&&和的右侧操作数||。也许由于这个原因,语言设计者认为like这样的表达式的含义a ||= f()并不明显,因此最好不要使用此类运算符。


2
是。例如,许多人认为a ||= b应该将其解释为a = a || b,但实际上可以将其解释为a || a = b(例如在Ruby中)。如果二传手有副作用,它们可能会有所不同。选择一个可能对另一阵营的用户不利。我个人喜欢这种a || a = b方式(Ruby方式),但是我不确定每个人对此是否满意。
富兰克林于

8

关于“为什么不实现该语言功能”的所有问题的总的答案是,设计该语言的团队认为收益不超过成本。

成本可以采取多种形式。实现语言功能需要花费时间和精力,但是还存在复杂性的内在代价:该功能是否会使语言变得更复杂或模棱两可,而与其潜在利益不成比例?

假设||=运算符所做的事情与其他复合赋值运算符根本不同。虽然其他运算符本质上纯粹是数学运算符,但是这是不同的:它用一个值替代另一个值(在您所描述的上下文中)。

考虑到这种歧义(操作员根据上下文执行两种不同的功能),不难看出为什么它不包含在语言中就不难了。虽然你说改变

function (options) {
    options = options || {};
}

function (options) {
    options ||= {};
}

执行空合并是一项有价值的功能,其好处对我而言还远远不够。如果要进行值替换,则同时拥有这两个值似乎是合乎逻辑的(而且更清楚)放在等号的右侧,以提供可能发生这种替换的视觉指示。

C#走了一条不同的道路,并使用特定的运算符进行空合并。


1
在阅读代码时,第一个示例的阅读更自然-“选项等于选项或什么都不做”-与第二个示例“选项等于或什么都不做”相比。我认为这是另一个理由不包括“或等于”运营商
安迪·亨特

很好的开放您的答案。而且我认为您答案的开头属于Wiki的标签。

3
@AndyBursh相同的逻辑可以应用于任何复合赋值运算符。与“ X等于2”相比,“ X等于X乘2”的读数更自然。
penartur 2013年

2
请注意,键入foo = foo || bar要求您键入foo两次。这既麻烦又易于重构错别字。
Phrogz 2014年

1
我认为您误解了“数学”的含义,也许您听说过布尔代数。我同意强制将非布尔值||=用作空合并运算符不是很直观,并且实际上在代码形式中看起来很钝。当您尝试进行布尔数学运算时,它变得有用的地方。function fulfill(inValue) { if(resolved || rejected) return false; /* Do stuff here */ return true; } resolved ||= fulfill(value)
joshperry 2014年

3

您说的对,这||=是有用的结构。它存在于Perl中。

实际上,Perl使所有这些可用:

**=    +=    *=    &=    <<=    &&=   -=    /=    
|=     >>=   ||=   .=    %=     ^=    //=   x=

其中一些很棒(.=在字符串末尾添加了一些内容),而有些则不太好(&&=???我想如果变量和变量都为真,则该变量将被设置在右侧。但是为什么您会这样做? ?)

语言所包含的内容实际上是其设计理念的特征。


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.