**
#ES2016
新增了一个指数运算符(**
)。
(() => {
const { log } = console;
log(2 ** 2); // 4
log(2 ** 3); // 8
// 相当于 2 ** (3 ** 2)
// 2 ** 3 ** 2
// 512
})()
这个运算符的一个特点是右结合
,而不是常见的左结合
。多个指数运算符连用时,是从最右边
开始计算的。
(() => {
const { log } = console;
// 相当于 2 ** (3 ** 2)
log(2 ** 3 ** 2); // 512
})()
上面代码中,首先计算的是第二个指数运算符,而不是第一个。
**=
#指数运算符可以与等号结合,形成一个新的赋值运算符(**=
)。
(() => {
const { log } = console;
let a = 1.5;
a **= 2;
// 等同于 a = a * a;
log(a); // 2.25
let b = 4;
b **= 3;
// 等同于 b = b * b * b;
log(b); // 64
})()
注意,V8
引擎的指数运算符与Math.pow
的实现不相同,对于特别大的运算结果,两者会有细微的差异。
(() => {
const { log } = console;
log(99 ** 99); // 3.697296376497268e+197
})()
上面代码中,两个运算结果的最后一位有效数字
是有差异的。