我可以加快JavaScript中对本机方法的调用吗?

时间:2014-02-12 22:01:11

标签: javascript

根据this answer to 'Is object empty?'

// Speed up calls to hasOwnProperty
var hasOwnProperty = Object.prototype.hasOwnProperty;

我在小型JavaScript库中看到过类似的几种实现,例如:

var slice = Array.prototype.slice;

//or

function slice(collection) {
    return Array.prototype.slice.call(collection);
}

我快速jsperf来测试这种事情,缓存看起来总体上比不缓存更快,但我的测试可能有缺陷。

(我使用'cache'这个词来表示将方法存储在变量中。)

这个问题的上下文是开发人员需要多次调用本机方法,以及可观察到的差异。

缓存本机方法是否会阻止引擎在每次调用方法时都必须查看该方法的对象内部,从而使缓存成为开发人员需要调用同一本机时调用本机方法的更快方法方法不止一次?

2 个答案:

答案 0 :(得分:4)

当您在库中使用Array.prototype.slice时,创建一个包含该函数的变量(var slice = Array.prototype.slice;)是有意义的,因为变量可以缩小由一个JavaScript minifier,否则它不能。

将函数赋值给变量也可以避免遍历对象的原型链,这可能会导致性能稍好。

请注意,这是微优化,您(一般来说)不应过多关注自己 - 将其留给现代JavaScript引擎。

答案 1 :(得分:1)

将值保存在变量中会带来一些优化机会,因为如果它是一个局部变量,则解释器可以进行分析以实现变量永远不会变异。另一方面,您总是需要取消引用像Array这样的全局变量,因为每个人都可以随时更改它们。

那就是说,我不知道这是否对性能有影响,特别是一旦你考虑JIT优化。

通常,人们使用var slice的最大原因是保持源代码简短。