为啥 -1**2 在 JavaScript 中是语法错误?

Posted

技术标签:

【中文标题】为啥 -1**2 在 JavaScript 中是语法错误?【英文标题】:Why is -1**2 a syntax error in JavaScript?为什么 -1**2 在 JavaScript 中是语法错误? 【发布时间】:2017-09-19 06:50:43 【问题描述】:

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

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

我认为这是一个算术表达式,其中** 是幂运算符。其他运营商没有这样的问题。

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

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

这里发生了什么?

【问题讨论】:

试试这个:(-1)**2. firefox 说:SyntaxError: unparenthesized unary expression can't appear on the left-hand side of '**' - 你一定在使用 Chrome - 错误消息充其量是完全没用的 @psmith,这是因为 FireFox 实现了 ** 运算符 in version 52。您在旧版本中遇到的语法错误反映了根本不支持 **(与优先级或括号无关)。 @JaromandaX 为什么要与 chrome 仇杀? JS 从未停止让我惊讶。 '1'+2'12''1'-2-1-1**2 引发错误,因为它可能是模棱两可的?哇。 【参考方案1】:

在浏览器控制台中执行它会显示 SyntaxError: Unexpected token **。

因为那是spec。这样设计是为了避免混淆它是一的否定的平方(即(-1) ** 2),还是一的平方的否定(即-(1 ** 2))。这种设计是 extensive discussion 运算符优先级的结果,以及对其他语言如何处理这一点的检查,最后决定通过将其设为语法错误来避免意外行为。

【讨论】:

从运算符优先级的角度来看这是一个有趣的决定,因为权力总是先于加法/减法。因此-1**2-1,而不是1 @Adriaan:不正确。在常规数学中,数字的负性通常不被视为减法。事实上,负一平方被视为负一的平方而不是一平方的负,因此它是 1 而不是 -1。换句话说,-1 不是指0-1,而是1 * -1 @slebetman -1^2 在数学中永远不会被视为(-1)^2。你见过多项式是怎么写的吗?如果我们遵循您的要求,我们将不得不写-(x^2)+bx+c 而不是通常使用的-x^2+bx+c。而且,更一般地说,a(x^2)+bx+c 而不是 ax^2+bx+c 这个评论主题似乎准确地强调了它被删除的原因:为了防止混淆。我的直接反应是将其解释为(-1)**2,因为一元通常优先于二进制,但当然为了与数学保持一致,将其解释为-(1**2) 也是有意义的。删除该功能意味着您不会编写一些东西并让它以不同的方式工作,而是会得到一个语法错误并查找推理(也许在 *** 上!),然后明确优先级 - 不再混淆。 @EricDuminil:javascript 曾经是这样的,但人们正在尽最大努力不按照旧的精神做出新的设计决策。【参考方案2】:

来自documentation on MDN:

在JavaScript中,不可能写出模棱两可的幂表达式,即不能放一元运算符(+/-/~/!/delete/void/@987654335 @) 紧接在基数之前。

同样的文字也解释了原因:

在大多数语言中,例如 php 和 Python 以及其他具有幂运算符(通常是 ^**)的语言中,幂运算符被定义为比一元运算符(例如一元 + 和一元 @)具有更高的优先级987654339@,但也有一些例外。例如,在 Bash 中,** 运算符被定义为比一元运算符具有更低的优先级。

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

(-1)**2

或:

-(1**2) 

附带说明,二进制 - 没有被这样处理——具有较低的优先级——因此最后一个表达式与这个有效表达式具有相同的结果:

0-1**2

其他编程语言中的求幂优先级

正如在上面的引用中已经确认的那样,大多数具有中缀指数运算符的编程语言都给予该运算符更高的优先级而不是一元减号。

以下是其他一些编程语言的示例,它们赋予一元减号运算符更高的优先级:

bc VBScript AppleScript COBOL Rexx Orc

【讨论】:

+1 感谢您提供指向人类可读文档的链接。 torazaburo 的规范链接有点难以理解。 当语言设计者引用 bash 作为先例时,一些愚蠢的事情即将发生。 @WumpusQ.Wumbley 在谈到负责 JS 的人时,“设计师”是一个非常强烈的词。如果您以前从未尝试过,请查看[]+[][]++[]+ 的结果。 @EricDuminil 我刚试过这个。我的发呆以前从未如此彻底地喘不过气来。 @cyberbit:致谢Gary Bernhardt。

以上是关于为啥 -1**2 在 JavaScript 中是语法错误?的主要内容,如果未能解决你的问题,请参考以下文章

在 TypeScript 中是无效的。为啥我从 console.log 得到结果?

为啥斜线在 JSON 中是可转义字符? [复制]

为啥 Object.clone() 在 Java 中是原生的?

函数在 Swift 中是值类型还是引用类型?为啥?

为啥大多数值在 Android xml 中是 8 的倍数?

为啥main方法在java中是静态的[重复]