在浏览器控制台中执行时,它显示为SyntaxError: Unexpected token **
。在节点中尝试:
> -1**2
...
...
...
...^C
我以为这是一个算术表达式,其中**
是幂运算符。其他操作员没有这样的问题。
奇怪的是,在第二行输入*/
会触发执行:
> -1**2
... */
-1**2
^^
SyntaxError: Unexpected token **
这是怎么回事?
发布于 2017-04-22 16:01:13
在浏览器控制台中执行它的
会显示SyntaxError: Unexpected **。
因为那是spec。这样设计的目的是为了避免混淆它是1的否定的平方(即(-1) ** 2
),还是1的平方的否定(即-(1 ** 2)
)。这种设计是运算符优先的extensive discussion的结果,并检查了在其他语言中如何处理这一点,最后决定通过将其作为语法错误来避免意外行为。
发布于 2017-04-22 16:03:08
在JavaScript中,不可能编写模棱两可的求幂表达式,即不能将一元运算符(+
/-
/~
/!
/delete
/void
/typeof
)紧跟在基数之前。
在同一文本中也解释了原因:
在大多数语言中(通常是
^
或**
),幂运算符定义为比一元运算符(如一元+
和一元-
)具有更高的优先级,但也有少数例外。例如,在Bash中,**
操作符被定义为具有比一元操作符更低的优先级。
因此,为了避免混淆,决定代码必须消除歧义,并显式地放入括号:
(-1)**2
或者:
-(1**2)
注意,二进制-
不是这样处理的--优先级较低--因此最后一个表达式的结果与这个有效表达式的结果相同:
0-1**2
其他编程语言中的指数优先
正如在上面的引述中所肯定的那样,大多数具有中缀求幂运算符的编程语言,给予该运算符的优先级高于一元减号。
下面是其他一些给予一元减号运算符更高优先级的编程语言示例:
https://stackoverflow.com/questions/43556752
复制相似问题