50-pow.js 998 Bytes
/**
 * @param {number} x
 * @param {number} n
 * @return {number}
 */
var myPow = function(x, n) {
    if (n === 0) return 1;
    if (n === 1) return x;

    if (x === 1) return 1;
    if (x === -1) return n % 2 === 0 ? 1 : -1;

    if (n < 0) {
        n = -n;
        x = 1/x;
    }
    
    return (n % 2 === 0) ? myPow(x*x, n/2) : x * myPow(x*x, (n-1)/2);
};

var slowPow = function(x, n) {
    if (Math.abs(x) >= 100) throw new Error('x is out of range');
    if (n !== ~~n) throw new Error('n is out of range');

    if (n === 0) return 1;
    if (x === 1) return 1;
    if (x === -1) return n % 2 === 0 ? 1 : -1;

    let N = 1e8;
    let ret = 1.0;
    let sign = n > 0 ? 1 : (n=-n)&&-1;
    while (n > 0) {
        ret *= p(x, n>=N?N:n);
        n -= N;
    }

    return sign > 0 ? ret : 1/ret;
};

var p = function(x, n) {
    let ret = 1.0;
    for (let i = 0; i < n; i++ ) {
        ret = ret * x;
    }
    return ret;
};

var x = 0, n = -3;
console.info(myPow(x, n), Math.pow(x, n));