我经常看到以下表达式:
var args = [].slice.call(arguments, 0);
但是[].slice.call([1,2,3,4,5], 0)
正好是[1,2,3,4,5]
。
它难道不只是说
var args = arguments
?
那么[].slice
在这里到底做了什么?
我经常看到以下表达式:
var args = [].slice.call(arguments, 0);
但是[].slice.call([1,2,3,4,5], 0)
正好是[1,2,3,4,5]
。
它难道不只是说
var args = arguments
?
那么[].slice
在这里到底做了什么?
slice
是一个数组方法,用于从数组中提取子数组:
slice
方法接受两个参数:start和end,并返回包含数组元素从start到end(但不包括end本身)的数组(如果end为undefined,则返回从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]
var args = [].slice.call(arguments, 0);
这种方式。相比于直接使用var args = arguments
,这种模式有什么优势吗? - Shih-Min Leearguments
对象来执行此操作。 - Sebastian Simonarguments
对象转换为数组的核心是使用仅数组对象具有的方法。 - Sebastian Simon