将 arguments 转换成数组的方法

将函数里的arguments,转换成一个真正的数组的方法。数组

arguments是个类数组,除了有实参所组成的相似数组之外,还有本身的属性,如calleearguments.callee就是当前正在执行的这个函数的引用,它只在函数执行时才存在。由于在函数开始执行时,才会自动建立第一个变量arguments对象。app

1、arguments是个类数组

  • 它将实参以数组的形式保存着,还能够像数组同样访问实参,如:arguments[0]函数

  • 它也有本身独特的属性,如:calleethis

  • 它的长度是实参的个数。prototype

    arguments.callee.length又是什么呢?code

    arguments.callee是当前正在执行的函数的引用,相似function.length,那就是形参的个数。对象

2、将arguments转换为真正的数组的方法

1. Array.prototype.slice.apply(arguments)

这是运行效率比较快的方法(看别人资料说的),为何不是数组也能够,由于arguments对象有length属性,而这个方法会根据length属性,返回一个具备length长度的数组。若length属性不为number,则数组长度返回0io

因此其余对象只要有length属性也是能够的哟,如对象中有属性0,对应的就是arr[0],即属性为天然数的number就是对应的数组的下标,若该值大于长度,固然要割舍啦。function

2. Array.prototype.concat.apply(thisArg,arguments)

thisArg是新的空数组,apply方法将函数this指向thisArgarguments作为类数组传参给applyclass

根据apply的方法的做用,即将Array.prototype.slice方法在指定的thisthisArg内调用,并将参数传给它。用此方法注意:若数组内有数组,会被拼接成一个数组。缘由是apply传参的特性。

3. 我本身想了个方法,利用Array的构造函数

Array(1,2,3,4,5,6),能够返回一个传入的参数的数组。那Array.apply(thisArg,arguments)也能够将arguments转化为数组,果真实验是能够的。

有没有什么影响呢,就是乱用了构造函数,但这也是 JS 的特性嘛,构造函数也是函数。

用此方法注意:若数组内有数组,会被拼接成一个数组。

缘由是apply传参的特性。

4. 用循环

由于arguments相似数组可使用arguments[0]来访问实参,那么将每项赋值给新的数组每项,直接复制比push要快,若实参有函数或者对象,就要深拷贝。

3、综上所述

最完美的方法应该是Array.prototype.slice.apply(arguments)了。

相关文章
相关标签/搜索