伪数组转换为数组

661 阅读2分钟

本文针对Array.prototype.slice.call(args)方法如何将伪数组args转为数组过程进行详细分析。

slice方法

数组的slice方法很常见,表示截取某一段数组元素,返回一个新的数组,属于实例方法。我们简单的来复习一下:

语法格式:arr.slice(start,end)

参数startend 表示截取数组的起始索引与结束索引,注意包前不包后,也就是说从起始索引处元素开始截取,但不包括结束索引处的元素。

注意:

  • 如果并未传入参数,相当于将原数组进行浅复制。
  • 如果传入一个参数,则从起始索引处截取到原数组的结束位置

call方法

call() 方法使用一个指定的this值和单独给出的一个或多个参数来调用一个函数,简单来说就是改变this指向并调用函数。

第一个参数为函数运行时this的值,其他参数则是调用函数所需要的传入的实参。

  1. 创建一个Foo构造函数,它有一个sayName方法
  2. 声明并初始化obj变量
  3. 使用new关键字创建一个foo对象实例
  4. foo对象调用sayName方法时,此时this指向foo实例,输出tm
  5. 在调用sayName时使用call改变this指向,则this指向obj,输出hz

伪数组

JavaScript语言中伪数组具备两个特征:

  1. 属性名必须是数字的字符串
  2. 具体length属性

伪数组不具备数组独有的pushpop等方法,但我们可以通过args[index]这种方式获取指定索引位置的值,虽然很简单,但这也是将伪数组转化为真正数组的机理。

Array.prototype.slice.call(arguments)

介绍完基本概念后,我们来正式探讨下如何将一个伪数组转化为真正的数组。

我们自定义构造函数时,一般将一些公有的方法放到原型对象上,slice方法也不例外,我们来猜想一下Array.prototype.slice.(start,end)它内部的实现机理。 它大致是以如下方式进行处理:

  1. 在函数内部声明并初始化一个新的数组。
  2. 循环遍历,将startend之间的数组元素通过push操作添加到新数组
  3. 返回新数组

我们需要做的便是将函数内部的this值替换为伪数组即可,伪数组则通过args[i]语法获取目标索引的值,从而通过push方法添加到新数组,而调用时call方法并未传入其他参数,则直接浅复制伪数组元素。

既然伪数组可以转化为数组,那字符串呢?请读者小试一手。