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)
Тип ошибки
Что пошло не так?
Вы, вероятно, написали что-то вроде этого:
-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