5

我经常在其他人的脚本中看到这样的内容:

bar = Array.prototype.slice.call(whatever, 1)

但是,以下较短的符号也可以正常工作:

bar = [].slice.call(whatever, 1)

这两个结构完全等效吗?是否有以不同方式对待它们的引擎(浏览器)?

4

2 回答 2

5

是的,完全等效。

碰巧访问 via.prototype稍微快一些,因为不需要创建新的对象实例。然而,这就是我们所说的微优化


完全摆脱深度链接的一个好方法是调用Function.prototype.bind.

例子

(function( slice ) {
    slice( whatever, 1 );
}( Function.prototype.call.bind( Array.prototype.slice )));
于 2013-04-11T15:51:55.823 回答
1

严格来说,它们并不等同。这种结构:

[].slice.call(whatever, 1)

在堆上分配新的数组实例只是为了从中获取属性。所以它有副作用——把垃圾留在堆里。

于 2013-04-11T15:58:44.260 回答