为什么-1 ** 2在JavaScript中有语法错误?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

它在浏览器控制台中执行它SyntaxError: Unexpected token **。尝试在节点中:

> -1**2
...
...
...
...^C

我认为这是一个算术表达式,**电力运营商在哪里。其他运营商没有这样的问题。

奇怪的是,*/在第二行输入会触发执行:

> -1**2
... */
-1**2
  ^^
SyntaxError: Unexpected token **

这里发生了什么?

提问于
用户回答回答于

在浏览器控制台中执行它说SyntaxError:意外的令牌**。

因为这是规范。设计这种方式以避免混淆是否是一个(即(-1) ** 2)的否定的平方,或者是否定一个(即-(1 ** 2))的平方的否定。这种设计是广泛讨论运算符优先级的结果,以及如何在其他语言中处理这种设计的结果,并且最终做出这样的决定是为了通过使语法错误来避免意外行为。

用户回答回答于

MDN文档

在JavaScript中,编写不明确的求幂表达式是不可能的,也就是说,不能在基数之前放置一个一元运算符(+/ -/ ~/ !/ delete/ void/ typeof)。

原因也在同一文本中解释:

在诸如PHP和Python等大多数语言以及其他具有指数运算符(通常^**)的其他语言中,指数运算符被定义为具有比一元运算符(例如一元+和一元)更高的优先级-,但有一些例外。例如,在Bash中,**运算符的定义优先级低于一元运算符。

所以为了避免混淆,决定代码必须消除歧义并明确地放置括号:

(-1)**2

要么:

-(1**2) 

作为一个方面说明,二进制文件 -没有这种处理方式 - 优先级较低 - 所以最后一个表达式与此有效表达式具有相同的结果:

0-1**2

其他编程语言中的指数优先

正如上面已经确认的那样,大多数具有中缀指数运算符的编程语言给予该运算符的优先级高于一元的优先级。

下面是编程语言的其他一些例子,它们给予一元减运算符更高的优先级:

扫码关注云+社区