Spec-Zone.ru › JavaScript

SyntaxError: унарное выражение без скобок не может находиться слева от '**'

Исключение JavaScript "unparenthesized unary expression can't appear on the left-hand side of '**'" возникает, когда унарный оператор (один из typeof, void, delete, await, !, ~, +, -) используется в левом операнде оператора возведения в степень без скобок.

Сообщение

SyntaxError: Unary operator used immediately before exponentiation expression. Parenthesis must be used to disambiguate operator precedence (V8-based)
SyntaxError: unparenthesized unary expression can't appear on the left-hand side of '**' (Firefox)
SyntaxError: Unexpected token '**'. Ambiguous unary expression in the left hand side of the exponentiation expression; parentheses must be used to disambiguate the expression. (Safari)

Тип ошибки

SyntaxError

Что пошло не так?

Вы, вероятно, написали что-то вроде этого:

-a ** b

Неясно, должно ли это вычисляться как (-a) ** b или -(a ** b). В математике -x2 означает -(x ** 2) — и именно так это обрабатывается во многих языках, включая Python, Haskell и PHP. Но придание унарному оператору минуса приоритета над ** нарушает симметрию с a ** -b, что однозначно является a ** (-b). Поэтому язык запрещает такой синтаксис и требует заключения одной из сторон в скобки для разрешения неоднозначности.

(-a) ** b
-(a ** b)

Другие унарные операторы также не могут быть левой частью операции возведения в степень.

await a ** b
!a ** b
+a ** b
~a ** b

Примеры

При написании сложных математических выражений, включающих возведение в степень, вы можете написать что-то вроде этого:

function taylorSin(x) {
  return (n) => (-1 ** n * x ** (2 * n + 1)) / factorial(2 * n + 1);
  // SyntaxError: unparenthesized unary expression can't appear on the left-hand side of '**'
}

Однако часть -1 ** n в JavaScript недопустима. Вместо этого заключите левый операнд в скобки:

function taylorSin(x) {
  return (n) => ((-1) ** n * x ** (2 * n + 1)) / factorial(2 * n + 1);
}

Это также сделает намерение кода гораздо более понятным для других читателей.

См. также

  • Возведение в степень (**)
  • Приоритет операторов
  • Исходное обсуждение приоритета оператора возведения в степень на esdiscuss.org

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Unparenthesized_unary_expr_lhs_exponentiation

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API