为什么-1**2在JavaScript中是一个语法错误?

为什么-1**2在JavaScript中是一个语法错误?,javascript,exponentiation,ecmascript-2016,Javascript,Exponentiation,Ecmascript 2016,在浏览器控制台中执行时,会显示SyntaxError:Unexpected token**。 正在节点中尝试: > -1**2 ... ... ... ...^C 我认为这是一个算术表达式,**是幂运算符。其他运营商不存在此类问题 奇怪的是,在第二行键入*/会触发执行: > -1**2 ... */ -1**2 ^^ SyntaxError: Unexpected token ** 这里发生了什么 在浏览器控制台中执行它会显示SyntaxError:Unexpected to

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

> -1**2
...
...
...
...^C
我认为这是一个算术表达式,
**
是幂运算符。其他运营商不存在此类问题

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

> -1**2
... */
-1**2
  ^^
SyntaxError: Unexpected token **
这里发生了什么

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

因为这就是问题所在。这样设计是为了避免混淆它是一的平方求反(即
(-1)**2
),还是一的平方求反(即
-(1**2)
)。此设计是运算符优先级的结果,并检查了在其他语言中如何处理此问题,最后决定通过将此设置为语法错误来避免意外行为。

来自:

在JavaScript中,不可能编写不明确的求幂表达式,也就是说,不能将一元运算符(
+
/
-
/
~
/
/
删除
/
无效
/
)紧跟在基数之前

同一文本也解释了原因:

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

因此,为了避免混淆,决定代码必须消除歧义,并显式添加括号:

(-1)**2
或:

作为旁注,二进制
-
不是这样处理的——优先级较低——因此最后一个表达式的结果与此有效表达式相同:

0-1**2
其他编程语言中的求幂优先级 正如在上面的引文中已经确认的那样,大多数具有中缀求幂运算符的编程语言对该运算符的优先级高于一元减号

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


试试这个:
(-1)**2
。firefox说:
语法错误:未语法化的一元表达式不能出现在“**”的左侧。
-你必须使用Chrome-错误消息在任何时候都是无用的best@psmith,这是因为FireFox实现了
**
操作符。您在旧版本中遇到的语法错误反映出根本不支持
**
(与优先级或括号无关)。@JaromandaX为什么与chrome?JS的仇杀从未停止让我感到惊讶<代码>'1'+2
'12'
'1'-2
-1
,但是
-1**2
会引发错误,因为它可能不明确?哇。从运算符优先级的角度来看,这个决定很有趣,因为幂总是在加法/减法之前。因此,
-1**2
-1
,而不是
1
。@Adriaan:不正确。在正规数学中,数字的负性通常不作为减法处理。事实上,负一平方被视为负一的平方,而不是负一平方,所以它不是-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)
也是有意义的。删除该功能意味着,您不需要编写某些内容并以不同的方式工作,而只需要得到一个语法错误并查找推理(可能是在StackOverflow上!),然后使优先级显式—不再混淆。@EricDuminil:Javascript过去是这样的,但是人们正在尽最大努力,不要本着旧的精神做出新的设计决策。+1感谢链接到人类可读的文档。torazaburo与规范的链接有点难以理解。当语言设计师引用bash作为先例时,一些愚蠢的事情即将发生。@WumpusQ.Wumbley“designers”在谈论负责JS的人时是一个非常有力的词。如果您以前从未尝试过,请查看
[]+[]
[]+{}
{}+[]
{}+{}
@EricDuminil的结果。我刚刚尝试过这个。“我的胃从来没有像现在这样完全气喘吁吁过。”@cybebit:Credits to。
0-1**2