Spec-Zone.ru › JavaScript

Возведение в степень (**)

Базовый уровень Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в версиях браузеров. Она доступна в браузерах с марта 2017 года.

Оператор возведения в степень (**) возвращает результат возведения первого операнда в степень второго операнда. Он эквивалентен Math.pow(), за исключением того, что он также принимает BigInt в качестве операндов.

Попробуйте

console.log(3 ** 4);
// Expected output: 81

console.log(10 ** -2);
// Expected output: 0.01

console.log(2 ** (3 ** 2));
// Expected output: 512

console.log((2 ** 3) ** 2);
// Expected output: 64

Синтаксис

x ** y

Описание

Оператор ** перегружен для двух типов операндов: число и BigInt. Сначала он приводит оба операнда к числовым значениям и проверяет их типы. Он выполняет возведение в степень BigInt, если оба операнда становятся BigInt; в противном случае он выполняет возведение в степень чисел. TypeError выбрасывается, если один операнд становится BigInt, а другой — числом.

Как для чисел, так и для BigInt, 0, возведенное в положительную степень, возвращает 0, а 0, возведенное в степень 0, возвращает 1. Для чисел, 0, возведенное в отрицательную степень, возвращает Infinity, тогда как -0, возведенное в отрицательную степень, возвращает -Infinity.

NaN ** 0 (и эквивалентный Math.pow(NaN, 0)) — единственный случай, когда NaN не распространяется через математические операции — он возвращает 1, несмотря на то, что операнд является NaN. Кроме того, поведение, когда base равен 1, а exponent является не конечным (±Infinity или NaN), отличается от IEEE 754, который определяет, что результат должен быть 1, тогда как JavaScript возвращает NaN для сохранения обратной совместимости с исходным поведением.

Для возведения в степень BigInt RangeError выбрасывается, если показатель степени y отрицателен. Это связано с тем, что любая отрицательная степень, вероятно, приведет к значению между 0 и 1 (если только основание не является 1, -1 или 0), которое округляется до нуля и, вероятно, является ошибкой разработчика.

Оператор возведения в степень является право-ассоциативным: a ** b ** c равен a ** (b ** c).

В большинстве языков, таких как PHP, Python и других, имеющих оператор возведения в степень (**), оператор возведения в степень определяется так, чтобы иметь более высокую приоритетность, чем унарные операторы, такие как унарный + и унарный -, но есть несколько исключений. Например, в Bash оператор ** определяется так, чтобы иметь более низкую приоритетность, чем унарные операторы.

В JavaScript невозможно написать неоднозначное выражение возведения в степень. То есть, вы не можете поставить унарный оператор (с приоритетом 14, включая +/-/~/!/++/--/delete/void/typeof/await) непосредственно перед числовой основой; это вызовет SyntaxError.

Например, -2 ** 2 равно 4 в Bash, но -4 в других языках (таких как Python). Это недопустимо в JavaScript, так как операция неоднозначна. Вам придется заключить в скобки одну из сторон — например, как -(2 ** 2) — чтобы сделать намерение однозначным.

Обратите внимание, что некоторые языки программирования используют символ каретки ^ для возведения в степень, но JavaScript использует этот символ для побитового XOR-оператора.

Примеры

Возведение в степень с использованием чисел

2 ** 3; // 8
3 ** 2; // 9
3 ** 2.5; // 15.588457268119896
10 ** -1; // 0.1
2 ** 1024; // Infinity
NaN ** 2; // NaN
NaN ** 0; // 1
1 ** Infinity; // NaN

Другие значения, не являющиеся BigInt, приводятся к числам:

2 ** "3"; // 8
2 ** "hello"; // NaN

Возведение в степень с использованием BigInt

2n ** 3n; // 8n
2n ** 1024n; // A very large number, but not Infinity

Вы не можете смешивать BigInt и числовые операнды при возведении в степень.

2n ** 2; // TypeError: Cannot mix BigInt and other types, use explicit conversions
2 ** 2n; // TypeError: Cannot mix BigInt and other types, use explicit conversions

Чтобы выполнить возведение в степень с BigInt и не-BigInt, преобразуйте любой из операндов:

2n ** BigInt(2); // 4n
Number(2n) ** 2; // 4

Ассоциативность

2 ** 3 ** 2; // 512
2 ** (3 ** 2); // 512
(2 ** 3) ** 2; // 64

Использование с унарными операторами

Чтобы инвертировать знак результата выражения возведения в степень:

-(2 ** 2); // -4

Чтобы принудительно сделать основание выражения возведения в степень отрицательным числом:

(-2) ** 2; // 4

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-exp-operator

Совместимость с браузерами

Desktop Mobile Server
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
exponentiation
52
14
52
39
10.1
52
52
41
10.3
6.0
51
10.3
1.0.0
1.0
7.0.0

См. также

  • Сложение (+)
  • Вычитание (-)
  • Деление (/)
  • Умножение (*)
  • Остаток от деления (%)
  • Инкремент (++)
  • Декремент (--)
  • Унарное отрицание (-)
  • Унарный плюс (+)

© 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/Operators/Exponentiation

Spec-Zone.ru

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