因为argument是一个对象,只不过它的属性从0开始排,依次为0,1,2…最后还有callee和length属性。我们也把这样的对象称为类数组。

常见的类数组还有:

  • 用getElementByTagName/ClassName/Name()获得的HTMLCollection
  • 用querySlector获得的nodeList

那这导致很多数组的方法就不能用了,必要时需要我们将它们转换成数组,有哪些方法呢?

1. Array.prototype.slice.call()

  1. function sum(a, b) {
  2. let args = Array.prototype.slice.call(arguments);
  3. console.log(args.reduce((sum, cur) => sum + cur));//args可以调用数组原生的方法啦
  4. }
  5. sum(1, 2);//3

2. Array.from()

  1. function sum(a, b) {
  2. let args = Array.from(arguments);
  3. console.log(args.reduce((sum, cur) => sum + cur));//args可以调用数组原生的方法啦
  4. }
  5. sum(1, 2);//3

这种方法也可以用来转换Set和Map哦!

3. ES6展开运算符

  1. function sum(a, b) {
  2. let args = [...arguments];
  3. console.log(args.reduce((sum, cur) => sum + cur));//args可以调用数组原生的方法啦
  4. }
  5. sum(1, 2);//3

4. 利用concat+apply

  1. function sum(a, b) {
  2. let args = Array.prototype.concat.apply([], arguments);//apply方法会把第二个参数展开
  3. console.log(args.reduce((sum, cur) => sum + cur));//args可以调用数组原生的方法啦
  4. }
  5. sum(1, 2);//3

当然,最原始的方法就是再创建一个数组,用for循环把类数组的每个属性值放在里面,过于简单,就不浪费篇幅了。

参考文章

三元博客