我发现将类似数组的对象(例如NodeList,Arguments)转换为真实数组的简洁方法是使用:
Array.prototype.slice.call(...);
然后,我想到了一种缩短语法的方法:
[].slice.call(...);
后一种方法是否会在每次调用时创建一个新数组,从而浪费时间和/或内存?我应该在复杂性必需的应用程序中避免这种语法,还是JavaScript引擎优化它?
答案 0 :(得分:3)
我认为应该避免使用[]
符号。如果你想节省空间,为什么不这样做:
// Once in JS
var slice = Array.prototype.slice.call;
// Many places in JS
slice(...);
答案 1 :(得分:1)
就个人而言,我没有看到使用缩短语法的主要问题。任何性能影响都是最小的(并且一些引擎无论如何都会相应地进行优化),因此归结为个人偏好。不过,有几种选择。例如,您可以使用ECMAScript第5版Function.prototype.bind
将其缩短为您想要的任何内容:
var sl = Function.prototype.call.bind(Array.prototype.slice);
var myArr = sl([1, 2, 3], 1);
//-> [ 2, 3 ]
当然,bind
can be implemented in unsupporting browsers。
在支持的浏览器/环境中,您也可以使用Array.from
或spread operator来获得相同的结果:
// Array.from works with any iterable or array-like object
var myArr = Array.from(arrayLike);
// Spread operator works only with iterables:
var myArr = [ ...arrayLike ];
如果您使用的是Traceur或Babel等转录程序,则已经支持这些转发器。