web-dev-qa-db-ja.com

JavaScriptで-1 ** 2が構文エラーになるのはなぜですか?

ブラウザコンソールで実行すると、SyntaxError: Unexpected token **。ノードで試してください:

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

これは算術式で、**は電力演算子です。他のオペレーターにはこのような問題はありません。

奇妙なことに、*/ 2行目で実行がトリガーされます。

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

ここで何が起きてるの?

56
psmith

ブラウザコンソールで実行すると、SyntaxError:Unexpected token **と表示されます。

それは spec だからです。それが1の否定の二乗(つまり_(-1) ** 2_)か、1の否定の二乗(つまり-(1 ** 2))かに関する混乱を避けるために、そのように設計されました。この設計は、演算子の優先順位の 広範な議論 の結果であり、これが他の言語でどのように処理されるかを調べ、最終的に、これを構文エラーにすることで予期しない動作を回避することを決定しました。

79
user663031

MDNのドキュメント から:

JavaScriptでは、あいまいなべき乗表現を書くことは不可能です。つまり、単項演算子(+/-/~/!/deleteを置くことはできません。/void/typeof)ベース番号の直前。

その理由も同じテキストで説明されています。

PHP and Pythonおよびその他の累乗演算子(通常は^または**)などの他の言語では、累乗演算子単項+や単項-などの単項演算子よりも優先順位が高いと定義されていますが、いくつかの例外があります。たとえば、Bashでは、**演算子は単項演算子よりも低い優先順位。

そのため、混乱を避けるために、コードは曖昧さを取り除き、括弧を明示的に配置する必要があると判断されました。

(-1)**2

または:

-(1**2) 

サイドノートとして、binary-はそのようには処理されません-優先順位が低いため-最後の式は同じですこの有効な式としての結果:

0-1**2

他のプログラミング言語でのべき乗の優先順位

上記の引用ですでに確認されているように、中置べき乗演算子を持つほとんどのプログラミング言語は、単項マイナスよりもその演算子に高い優先順位を与えます。

以下に、単項マイナス演算子を優先するプログラミング言語の他の例を示します。

40
trincot