arguments&&[].slice.call(arguments)和[].shift.call(arguments)个人理解

一、arguments理解:
arguments&&[].slice.call(arguments)和[].shift.call(arguments)个人理解
每个函数都有一个Arguments对象实例arguments,引用了函数的实参,可通过数组下标的方式引用arguments的元素。arguments.length为函数实参个数,arguments.callee引用函数自身。
二、特点
1.arguments对象和Function是分不开的。
2.因为arguments这个对象不能显式创建。
3.arguments对象只有函数开始时才可用。
三、是什么
    arguments对象并不是一个数组(类数组),但是访问单个参数的方式与访问数组元素的方式相同。
我们知道每一个对象都有自己的属性,arguments对象也不例外,首先arguments的访问犹如Array对象一样,用0到arguments.length-1来枚举每一个元素。
    callee属性:返回正被执行的function 对象,也就是所指定的 Function 对象的正文。callee 属性是 arguments 对象的一个成员,仅当相关函数正在执行时才可用。callee 属性的初始值就是正被执行的** Function** 对象。实现匿名的递归函数。
arguments&&[].slice.call(arguments)和[].shift.call(arguments)个人理解
    arguments此对象大多用来针对同个方法多处调用并且传递参数个数不一样时进行使用。根据arguments的索引来判断执行的方法。
但是需要注意的是,当你创建了一个函数,如果直接调用函数,那么this就是指向window; 当调用arguments对象,this指向的就是arguments对象,所以打印出来的也是arguments的属性length
arguments&&[].slice.call(arguments)和[].shift.call(arguments)个人理解
三、[].slice.call[].shift.call(arguments)
了解了arguments的概念以后,每一个[]都是大写Array的实例,也就是说[].slice.call===Array.prototype.slice.call
slice方法属于Array原型上的方法,可以被所有的实例公用。
slice:slice() 方法返回一个新的数组对象,这一对象是一个由 begin 和 end 决定的原数组的浅拷贝(包括 begin,不包括end)。原始数组不会被改变,语法:arr.slice([begin[, end]]),如果省略 begin,则 slice 从索引 0 开始。

因为arguments是一个类对象,所以需要借用数组原型上的slice方法。
[].slice.call(arguments):类数组变成新数组
slice内部使用的this代表调用对象,[].slice.call()传入arguments对象的时候,通过call改变原来slice方法的指向,上下文就变成了arguments,并且对arguments进行浅拷贝以后返回一个新数组。
shift: 从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度
[].shift.call(arguments)原理和slice同样,改变函数内部的this,删除并拿到arguments的第一项。