Bueno, sé que esta es una vieja pregunta. Pero, según la respuesta de SwiftNinjaPro, simplifiqué la función y solucioné algunos problemas de NaN. Nota: Esta función utilizó la característica ES6, la función de flecha y cadenas de plantillas, y exponenciación. Por lo tanto, es posible que no funcione en navegadores más antiguos:
Math.numberRoot = (x, n) => {
return (((x > 1 || x < -1) && n == 0) ? Infinity : ((x > 0 || x < 0) && n == 0) ? 1 : (x < 0 && n % 2 == 0) ? `${((x < 0 ? -x : x) ** (1 / n))}${"i"}` : (n == 3 && x < 0) ? -Math.cbrt(-x) : (x < 0) ? -((x < 0 ? -x : x) ** (1 / n)) : (n == 3 && x > 0 ? Math.cbrt(x) : (x < 0 ? -x : x) ** (1 / n)));
};
Ejemplo:
Math.numberRoot(-64, 3);
Ejemplo (resultado numérico imaginario):
Math.numberRoot(-729, 6);