Exponentiation (**)
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since March 2017.
Operator lũy thừa (**) trả về kết quả của việc nâng toán hạng đầu tiên lên lũy thừa của toán hạng thứ hai. Nó tương đương với Math.pow(), ngoại trừ việc nó cũng chấp nhận BigInt làm toán hạng.
Try it
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
Cú pháp
x ** y
Mô tả
Operator ** được nạp chồng cho hai kiểu toán hạng: số và BigInt. Đầu tiên nó ép buộc cả hai toán hạng thành các giá trị số và kiểm tra kiểu của chúng. Nó thực hiện lũy thừa BigInt nếu cả hai toán hạng đều trở thành BigInt; nếu không, nó thực hiện lũy thừa số. Một TypeError được ném ra nếu một toán hạng trở thành BigInt nhưng toán hạng kia trở thành số.
Đối với cả số và BigInt, 0 nâng lên lũy thừa dương trả về 0, và 0 nâng lên lũy thừa 0 trả về 1. Đối với số, 0 nâng lên số âm trả về Infinity, trong khi -0 nâng lên số âm trả về -Infinity.
NaN ** 0 (và tương đương Math.pow(NaN, 0)) là trường hợp duy nhất mà NaN không lan truyền qua các phép toán — nó trả về 1 mặc dù toán hạng là NaN. Ngoài ra, hành vi khi base là 1 và exponent là không hữu hạn (±Infinity hoặc NaN) khác với IEEE 754, trong đó kết quả phải là 1, trong khi JavaScript trả về NaN để duy trì khả năng tương thích ngược với hành vi ban đầu.
Đối với lũy thừa BigInt, một RangeError được ném ra nếu số mũ y là âm. Điều này là do bất kỳ số mũ âm nào có khả năng dẫn đến một giá trị giữa 0 và 1 (trừ khi cơ số là 1, -1, hoặc 0), được làm tròn về 0, và có thể là lỗi của lập trình viên.
Operator lũy thừa có tính kết hợp phải: a ** b ** c bằng a ** (b ** c).
Trong hầu hết các ngôn ngữ, chẳng hạn như PHP, Python, và các ngôn ngữ khác có operator lũy thừa (**), operator lũy thừa được định nghĩa có độ ưu tiên cao hơn các unary operator, chẳng hạn như + một ngôi và - một ngôi, nhưng có một vài ngoại lệ. Ví dụ, trong Bash, operator ** được định nghĩa có độ ưu tiên thấp hơn các unary operator.
Trong JavaScript, không thể viết một biểu thức lũy thừa không rõ ràng. Tức là, bạn không thể đặt một unary operator (với độ ưu tiên 14, bao gồm +/-/~/!/++/--/delete/void/typeof/await) ngay trước số cơ số; làm như vậy sẽ gây ra SyntaxError.
Ví dụ, -2 ** 2 là 4 trong Bash, nhưng là -4 trong các ngôn ngữ khác (chẳng hạn Python). Điều này không hợp lệ trong JavaScript, vì phép toán này là không rõ ràng. Bạn phải đặt dấu ngoặc đơn ở một trong hai phía — ví dụ, -(2 ** 2) — để làm rõ ý định.
Lưu ý rằng một số ngôn ngữ lập trình sử dụng ký hiệu mũ ^ cho lũy thừa, nhưng JavaScript sử dụng ký hiệu đó cho bitwise XOR operator.
Ví dụ
>Lũy thừa dùng số
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
Các giá trị không phải BigInt khác được ép buộc thành số:
2 ** "3"; // 8
2 ** "hello"; // NaN
Lũy thừa dùng BigInt
2n ** 3n; // 8n
2n ** 1024n; // A very large number, but not Infinity
Bạn không thể trộn lẫn các toán hạng BigInt và số trong lũy thừa.
2n ** 2; // TypeError: Cannot mix BigInt and other types, use explicit conversions
2 ** 2n; // TypeError: Cannot mix BigInt and other types, use explicit conversions
Để thực hiện lũy thừa với BigInt và một giá trị không phải BigInt, hãy chuyển đổi một trong hai toán hạng:
2n ** BigInt(2); // 4n
Number(2n) ** 2; // 4
Tính kết hợp
2 ** 3 ** 2; // 512
2 ** (3 ** 2); // 512
(2 ** 3) ** 2; // 64
Dùng với unary operator
Để đảo dấu kết quả của một biểu thức lũy thừa:
-(2 ** 2); // -4
Để bắt buộc cơ số của một biểu thức lũy thừa là số âm:
(-2) ** 2; // 4
Thông số kỹ thuật
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-exp-operator> |