2010-09-16 82 views
3

我发现,类似阵列的对象(例如节点列表,参数)转换为真正的数组一种巧妙的方法是使用:缩短的语法会浪费内存吗?

Array.prototype.slice.call(...); 

于是,我想到了一个办法缩短这个语法:

[].slice.call(...); 

通过在每次调用它时创建一个新数组会浪费时间和/或内存吗?我是否应该在复杂性必要的应用程序中避免使用这种语法,或者JavaScript引擎是否优化?

回答

3

我认为应该避免使用[]表示法。如果你想节省空间,为什么不做:

// Once in JS 
var slice = Array.prototype.slice.call; 

// Many places in JS 
slice(...); 
+1

您的解决方案存在一些小问题;这样做会使'slice'返回'window',因为某种上下文错误。它可能更好地做一些事情,比如'function slice(a){return Array.prototype.slice.call(a); }' – 2010-09-16 09:53:00

+0

真的吗?也许你的权利,我没有测试它。我主要只是想说明我的观点。 – Tauren 2010-09-16 10:06:55

1

就个人而言,我没有看到使用您的简短语法的主要问题。任何性能影响都很小(并且一些引擎会相应地优化),所以它归结为个人偏好。不过,有几种替代方案可供选择。例如,你可以使用的ECMAScript第五版Function.prototype.bind以缩短到任何你想要的:

var sl = Function.prototype.call.bind(Array.prototype.slice); 
var myArr = sl([1, 2, 3], 1); 
//-> [ 2, 3 ] 

当然,bindcan be implemented in unsupporting browsers

在支持的浏览器/环境中,您可能还可以使用Array.fromspread operator达到同样的结果:如果您使用的是transpiler如Traceur或巴贝尔

// Array.from works with any iterable or array-like object 
var myArr = Array.from(arrayLike); 

// Spread operator works only with iterables: 
var myArr = [ ...arrayLike ]; 

,这些都已经支持的。

+1

伟大的提示!我会赞成,但现在我已经达到了我的投票限制。 – 2010-09-16 10:41:23

+0

'Array.prototype.slice.call.bind(Array.prototype.slice);'是将上下文绑定到函数原型的'call'方法的很长一段路。 应该是'var sl = Function.prototype.call.bind(Array.prototype.slice);' – 2015-09-01 08:55:55

+0

@bm_i:你说得对,当然。我已经更新了一些ES 2015的更新选项。 – 2015-09-01 09:30:52