ES6 Math.pow(99, 99) 与 99 ** 99 计算结果不同?

新手上路,请多包涵
Math.pow(99, 99)
// 3.697296376497263e+197

99 ** 99
// 3.697296376497268e+197

结果的最后一位为什么不一样

阅读 3.2k
3 个回答

求幂运算符(**)是一个ES7提议的新特性。
实现原理应该会跟Math.pow稍微有些差别吧
至于差别应该需要了解浏览器的实现原理了

新手上路,请多包涵

Math.pow() 是宿主环境提供的内置对象方法,因此总是运行时计算;当使用幂操作符 ** 时,如果左右操作数都是固定数字,引擎会在编译阶段进行一项称为常量折叠(const folding)的优化技术,而两者在实现上存在一定的差异。可以使用如下方法验证:

Math.pow(99, 99) === 99 ** 99 // false

const a = 99
const b = 99

Math.pow(99, 99) === a ** b // true(使用变量会阻止引擎进行常量折叠优化,`**` 被转成了 `Math.pow()`,因此结果为 true)

详情可以参考这篇:https://segmentfault.com/a/11...

推荐问题
宣传栏