Возведение в степень (**)
Базовый уровень Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в версиях браузеров. Она доступна в браузерах с марта 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
Спецификации
Совместимость с браузерами
| 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