将函数里的arguments
,转换成一个真正的数组的方法。数组
arguments
是个类数组,除了有实参所组成的相似数组之外,还有本身的属性,如callee
,arguments.callee
就是当前正在执行的这个函数的引用,它只在函数执行时才存在。由于在函数开始执行时,才会自动建立第一个变量arguments
对象。app
arguments
是个类数组它将实参以数组的形式保存着,还能够像数组同样访问实参,如:arguments[0]
;函数
它也有本身独特的属性,如:callee
;this
它的长度是实参的个数。prototype
那arguments.callee.length
又是什么呢?code
arguments.callee
是当前正在执行的函数的引用,相似function.length
,那就是形参的个数。对象
arguments
转换为真正的数组的方法Array.prototype.slice.apply(arguments)
这是运行效率比较快的方法(看别人资料说的),为何不是数组也能够,由于arguments
对象有length
属性,而这个方法会根据length
属性,返回一个具备length
长度的数组。若length
属性不为number
,则数组长度返回0
;io
因此其余对象只要有length
属性也是能够的哟,如对象中有属性0
,对应的就是arr[0]
,即属性为天然数的number
就是对应的数组的下标,若该值大于长度,固然要割舍啦。function
Array.prototype.concat.apply(thisArg,arguments)
thisArg
是新的空数组,apply
方法将函数this
指向thisArg
,arguments
作为类数组传参给apply
。class
根据apply
的方法的做用,即将Array.prototype.slice
方法在指定的this
为thisArg
内调用,并将参数传给它。用此方法注意:若数组内有数组,会被拼接成一个数组。缘由是apply
传参的特性。
Array
的构造函数如Array(1,2,3,4,5,6)
,能够返回一个传入的参数的数组。那Array.apply(thisArg,arguments)
也能够将arguments
转化为数组,果真实验是能够的。
有没有什么影响呢,就是乱用了构造函数,但这也是 JS 的特性嘛,构造函数也是函数。
用此方法注意:若数组内有数组,会被拼接成一个数组。
缘由是apply
传参的特性。
由于arguments
相似数组可使用arguments[0]
来访问实参,那么将每项赋值给新的数组每项,直接复制比push
要快,若实参有函数或者对象,就要深拷贝。
最完美的方法应该是Array.prototype.slice.apply(arguments)
了。