[].slice 到底是做什么的

Shi*_*Lee 4 javascript

我多次看到这样的表达:

var args = [].slice.call(arguments, 0);
Run Code Online (Sandbox Code Playgroud)

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

这不就是说

var args = arguments

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

Ori*_*iol 5

slice是一个从数组中提取子数组的数组方法:

slice方法接受两个参数startend ,并返回一个数组,其中包含从 element start到(但不包括)元素end的数组元素(如果end未定义,则返回到数组末尾)。

例如:

[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]
Run Code Online (Sandbox Code Playgroud)

具体来说,slice()slice(0)都会生成数组的副本。然后您将能够在不影响原始版本的情况下更改副本,反之亦然。

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

slice函数故意是通用的;它不要求其this值是一个 Array 对象。因此它可以转移到其他类型的对象以用作方法。

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

[].slice.call({0:0, 1:1, 2:2, length:3}); // [0,1,2]
Run Code Online (Sandbox Code Playgroud)

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

Array.from({0:0, 1:1, 2:2, length:3}); // [0,1,2]
Run Code Online (Sandbox Code Playgroud)

使用真正的数组而不是类似数组的对象的优点是可以在它们上使用数组方法。