[].slice到底是做什么的?

4

我经常看到以下表达式:

var args = [].slice.call(arguments, 0);

但是[].slice.call([1,2,3,4,5], 0)正好是[1,2,3,4,5]

它难道不只是说

var args = arguments

那么[].slice在这里到底做了什么?


它将函数参数转换为数组,因此您可以在其上使用Array原型方法。 - Sebastian Simon
关于第二个问题。我看到很多人都在使用var args = [].slice.call(arguments, 0);这种方式。相比于直接使用var args = arguments,这种模式有什么优势吗? - Shih-Min Lee
阅读我上面的评论:它允许您使用数组原型方法。 您无法对“arguments”对象进行“排序”,无法对“arguments”对象进行“过滤”,也无法对“arguments”对象进行“映射”。 但是,您可以使用已切片的数组-arguments对象来执行此操作。 - Sebastian Simon
不确定我是否正确解释了您对“future”一词的使用; 您是指“代码后面”还是“在ES6成为标准时将来”?将arguments对象转换为数组的核心是使用仅数组对象具有的方法。 - Sebastian Simon
我是说代码后面的部分。 - Shih-Min Lee
显示剩余2条评论
1个回答

5

slice是一个数组方法,用于从数组中提取子数组:

slice方法接受两个参数:startend,并返回包含数组元素从startend(但不包括end本身)的数组(如果endundefined,则返回从start到数组末尾的所有元素)。

例如:

[0,1,2,3,4].slice(2);   // [2,3,4]
[0,1,2,3,4].slice(-2);  // [3,4]
[0,1,2,3,4].slice(2,4); // [2,3]
[0,1,2,3,4].slice();    // [0,1,2,3,4]

具体来说,slice()slice(0) 都会产生一个数组的副本。然后您可以修改该副本而不影响原始数组,反之亦然。

此外,它也可以与类似数组的对象一起使用:

slice 函数是有意通用的;它不需要其this值为 Array 对象。因此,它可以被传递给其他类型的对象以用作方法。

因此,它经常被用于从类似数组的对象中构建真正的数组:

[].slice.call({0:0, 1:1, 2:2, length:3}); // [0,1,2]

注意,在ECMAScript 6中不再需要使用此技巧,因为你可以使用Array.from

Array.from({0:0, 1:1, 2:2, length:3}); // [0,1,2]

拥有真正的数组而不是类似数组的对象的优点在于,您可以在其上使用数组方法。

感谢指出类数组对象的创建方法。 - Shih-Min Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接