为什么在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