JavaScript指数一元运算符设计决策

kem*_*toe 4 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
Run Code Online (Sandbox Code Playgroud)

MDN文档:

在JavaScript中,这是不可能写出暧昧幂表达式,即你不能把一元运算符(+/ -/ ~/ !/ delete/ void/ typeof)之前的基数.

在大多数语言(如PHP和Python)和其他具有取幂运算符(通常^或者**)的语言中,指数运算符被定义为具有比一元运算符(如一元+和一元)更高的优先级-,但也有一些例外.例如,在Bash中,**运算符被定义为具有比一元运算符更低的优先级.

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

在Javascript '1'+ 2'12''1'-2-1,但-1**2提出了一个错误,因为它可能是模糊的?帮助我理解这个设计决定.

Ber*_*rgi 7

我不明白这个设计决定.

了解更多关于它在https://esdiscuss.org/topic/exponentiation-operator-precedence,https://esdiscuss.org/topic/power-operator-why-does-2-3-throws,https://开头的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 " - 亚历山大·琼斯
  • " 问题在于,在取幂表达式之前可能是罕见的一元减去,缺少上标与较小字体的消息比较-紧密**.实际上除了dot(一种特殊形式,其右操作数必须是词汇标识符 -名称)和方括号(本身不是中缀运算符),一元运算符绑定比JS中的二进制更严格,如C和其他C派生语言. " - Brendan Eich
  • " 对于数学来说,似乎很明显.但是因为中缀运算符周围的空白.即使没有空格,也似乎是文字的一部分.-52-5 ** 2- " - 戴夫赫尔曼
  • [关于编程语言的优先顺序]," 实际上没有人会从其他语言中得到关于此的信息.同意人们有一个**指数运算符.但人们通常会试图避免黑暗角落,因此他们永远不会对负面基础产生直觉. " - 戴夫赫尔曼

在Javascript '1'+ 2'12''1'-2-1,但-1**2提出了一个错误,因为它可能是模糊的?

那么他们在设计今天的语言扩展方面付出了相当大的努力:-)这是他们可以达成共识的最佳解决方案.