所以我在使用新的取幂运算符,我发现你不能在基数之前放置一元运算符。
let result = -2 ** 2; // syntax error
let result = -(2 ** 2); // -4
let x = 3;
let result = --x ** 2; // 4
在JavaScript中,不可能编写模糊的取幂表达式,即你不能放置一元运算符(
+
/-
/~
/!
/ {{紧靠基数之前的1}} /delete
/void
}。在大多数语言中,如PHP和Python以及其他具有取幂运算符的语言(通常为
typeof
或^
),指数运算符的优先级高于一元运算符(如一元{{ 1}}和一元**
,但也有一些例外。例如,在Bash中,+
运算符的优先级低于一元运算符。
据我所知这是设计错误。我不明白这个设计决定。谁-
是负面的,真的会感到惊讶?这不仅遵循其他主流编程语言,而且是数百年来常用的数学符号,并且教给每个高中代数学生。
在Javascript **
中-x ** 2
而'1'+ 2
为'12'
,但'1'-2
会引发错误,因为它可能不明确?帮助我理解这个设计决定。
答案 0 :(得分: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-operator和https://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
会引发错误,因为它可能不明确?
他们今天在设计语言扩展方面投入了相当多的精力:-)这是他们能够达成共识
的最佳解决方案。