指数运算符

** #

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
})()

上面代码中,两个运算结果的最后一位有效数字是有差异的。

Build by Loppo 0.6.16