JavaScript取幂一元运算符设计决策

时间:2017-11-02 06:20:00

标签: javascript operator-precedence exponentiation ecmascript-2016

所以我在使用新的取幂运算符,我发现你不能在基数之前放置一元运算符。

let result = -2 ** 2; // syntax error
let result = -(2 ** 2); // -4
let x = 3;
let result = --x ** 2; // 4

来自documentation on MDN

  

在JavaScript中,不可能编写模糊的取幂表达式,即你不能放置一元运算符(+ / - / ~ / ! / {{紧靠基数之前的1}} / delete / void}。

     

在大多数语言中,如PHP和Python以及其他具有取幂运算符的语言(通常为typeof^),指数运算符的优先级高于一元运算符(如一元{{ 1}}和一元**,但也有一些例外。例如,在Bash中,+运算符的优先级低于一元运算符。

据我所知这是设计错误。我不明白这个设计决定。谁-是负面的,真的会感到惊讶?这不仅遵循其他主流编程语言,而且是数百年来常用的数学符号,并且教给每个高中代数学生。

在Javascript **-x ** 2'1'+ 2'12',但'1'-2会引发错误,因为它可能不明确?帮助我理解这个设计决定。

1 个答案:

答案 0 :(得分:7)

  

我不明白这个设计决定。

https://esdiscuss.org/topic/exponentiation-operator-precedencehttps://esdiscuss.org/topic/power-operator-why-does-2-3-throwshttps://github.com/rwaldron/tc39-notes/blob/master/es7/2015-09/sept-23.md#exponentiation-operatorhttps://github.com/rwaldron/tc39-notes/blob/master/es7/2015-09/sept-24.md#exponentiation-operator了解详情。

  

-x ** 2是负面的,谁真的会感到惊讶?

足够重要的人。以上资源的一些相关引用:

  • 使**绑定比一元操作符更紧密会破坏x**-2。并且使其有时更紧,有时更宽松会太混乱,并导致其他优先倒置的机会。“ - Waldemar Horwat
  • 鉴于**在其他语言中的历史之间存在冲突,[和]一元模式比二元更严格的一般模式,此时的任何解决方案都会让很多人感到困惑。 “ - Mark S. Miller
  • 承认重要空白的前景:-x**2 === -(x ** 2)-x ** 2 === (-x) ** 2 ” - Alexander Jones
  • 然而问题是,在取幂表达式之前很少有一元减去,缺少上标与较小字体的格式-**更紧密。除了dot(一个特殊形式,其右操作数必须是词汇标识符名称)和方括号(本身不是一个中缀操作符),一元运算符绑定比JS中的二进制更严格,就像在C和其他C语言中一样。“ - Brendan Eich
  • 对于数学而言-52似乎很明显。但对于-5 ** 2,由于中缀运算符周围的空白。即使没有空格,-似乎也是文字。“ - 戴夫赫尔曼
  • [关于编程语言优先级],“实际上没有人会从其他语言中对此进行说明。同意人们有**是指数运算符的说法。但人们通常会尽量避免暗角所以他们永远不会对负面基础产生直觉。“ - 戴夫赫尔曼
  

在Javascript '1'+ 2'12''1'-2-1,但-1**2会引发错误,因为它可能不明确?

他们今天在设计语言扩展方面投入了相当多的精力:-)这是他们能够达成共识

的最佳解决方案。