为什么在JavaScript中Math.pow()(有时)不等于**?

我刚刚发现了ECMAScript 7特性a**b作为Math.pow(a,b) ( MDN参考 )的一个替代方法,并且在Math.pow(a,b) 文章中发现了一个他们明显performance不同的讨论。 我已经在Chrome 55中进行了testing,可以确认结果不同。

Math.pow(99,99)返回3.697296376497263e+197

99**99返回3.697296376497268e+197

因此,logging区别Math.pow(99,99) - 99**99结果-5.311379928167671e+182

到目前为止,可以这么说,这只是另一个实现,但是将其封装到一个函数中又会有所不同:

 function diff(x) { return Math.pow(x,x) - x**x; } 

调用diff(99)返回0

为什么会这样呢?

正如xszaboj指出的,这可以缩小到这个问题:

 var x = 99; x**x - 99**99; // Returns -5.311379928167671e+182 

99**99 在编译时被评估 (“常数折叠”),编译器的pow例程与运行时不同。 在运行时评估**时,结果与Math.pow相同 – 难怪由于**实际编译为Math.pow调用:

 console.log(99**99); // 3.697296376497268e+197 a = 99, b = 99; console.log(a**b); // 3.697296376497263e+197 console.log(Math.pow(99, 99)); // 3.697296376497263e+197