我经常在其他人的脚本中看到这样的内容:
bar = Array.prototype.slice.call(whatever, 1)
但是,以下较短的符号也可以正常工作:
bar = [].slice.call(whatever, 1)
这两个结构完全等效吗?是否有以不同方式对待它们的引擎(浏览器)?
我经常在其他人的脚本中看到这样的内容:
bar = Array.prototype.slice.call(whatever, 1)
但是,以下较短的符号也可以正常工作:
bar = [].slice.call(whatever, 1)
这两个结构完全等效吗?是否有以不同方式对待它们的引擎(浏览器)?
是的,完全等效。
碰巧访问 via.prototype
稍微快一些,因为不需要创建新的对象实例。然而,这就是我们所说的微优化。
完全摆脱深度链接的一个好方法是调用Function.prototype.bind
.
例子
(function( slice ) {
slice( whatever, 1 );
}( Function.prototype.call.bind( Array.prototype.slice )));
严格来说,它们并不等同。这种结构:
[].slice.call(whatever, 1)
在堆上分配新的数组实例只是为了从中获取属性。所以它有副作用——把垃圾留在堆里。