对[].slice.call(arguments,1)的思考

今天在写轮播组件的时候发现了这样一句话:
[].slice.call(document.querySelectorAll(selector));
在学习的过程中经常看到Array.prototype.slice.call()的写法,一直不太了解原理,今天查阅文档有了一定的理解。

查阅MDN文档
Array.prototype.slice()
slice() 方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象,原始数组不会被修改。

let a = ['zero', 'one', 'two', 'three'];
let sliced = a.slice(1, 3);

console.log(a);      // [ 'zero', 'one', 'two', 'three' ]
console.log(sliced); // [ 'one', 'two' ]

语法EDIT

arr.slice()
arr.slice(begin)
arr.slice(begin, end)

参数EDIT

begin可选

从该索引处开始提取原数组中的元素(从0开始)。
如果该参数为负数,则表示从原数组中的倒数第几个元素开始提取,slice(-2)表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。
如果省略 begin,则 slice 从索引 0 开始。

end可选

在该索引处结束提取原数组元素(从0开始)。slice会提取原数组中索引从 begin 到 end 的所有元素(包含begin,但不包含end)。
slice(1,4) 提取原数组中的第二个元素开始直到第四个元素的所有元素 (索引为 1, 2, 3的元素)。
如果该参数为负数, 则它表示在原数组中的倒数第几个元素结束抽取。 slice(-2,-1)表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一个元素,也就是只有倒数第二个元素)。
如果 end 被省略,则slice 会一直提取到原数组末尾。
如果 end 大于数组长度,slice 也会一直提取到原数组末尾。
返回值:一个含有提取元素的新数组

描述EDIT

slice 不修改原数组,只会返回一个浅复制了原数组中的元素的一个新数组。原数组的元素会按照下述规则拷贝:

如果该元素是个对象引用 (不是实际的对象),slice 会拷贝这个对象引用到新的数组里。两个对象引用都引用了同一个对象。如果被引用的对象发生改变,则新的和原来的数组中的这个元素也会发生改变。
对于字符串、数字及布尔值来说(不是 String、Number 或者 Boolean 对象),slice 会拷贝这些值到新的数组里。在别的数组里修改这些字符串或数字或是布尔值,将不会影响另一个数组。
如果向两个数组任一中添加了新元素,则另一个不会受到影响。

Function.prototype.call() 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法.

所以综上,这句话相当于Array.slice.call(arguments),目的是将arguments对象的数组提出来转化为数组,arguments本身并不是数组而是对象。而其中的[]等价于Array.prototype

本文总阅读量