我经常在其他人的剧本中看到类似的东西:
bar = Array.prototype.slice.call(whatever, 1)
但是,以下较短的符号也可以正常工作:
bar = [].slice.call(whatever, 1)
这两个结构完全相同吗?是否存在以不同方式对待它们的引擎(浏览器)?
答案 0 :(得分:5)
是的,完全等同。
恰好是通过.prototype
的访问速度稍快,因为不需要创建新的对象实例。然而,这就是我们所说的微优化。
完全摆脱深层链接的好方法是调用Function.prototype.bind
。
实施例
(function( slice ) {
slice( whatever, 1 );
}( Function.prototype.call.bind( Array.prototype.slice )));
答案 1 :(得分:1)
严格来说,它们并不等同。这种结构:
[].slice.call(whatever, 1)
在堆上分配新的数组实例只是为了从中获取属性。 所以它有副作用 - 在堆中留下垃圾。