本文针对
Array.prototype.slice.call(args)方法如何将伪数组args转为数组过程进行详细分析。
slice方法
数组的slice方法很常见,表示截取某一段数组元素,返回一个新的数组,属于实例方法。我们简单的来复习一下:
语法格式:arr.slice(start,end)
参数start、end 表示截取数组的起始索引与结束索引,注意包前不包后,也就是说从起始索引处元素开始截取,但不包括结束索引处的元素。

- 如果并未传入参数,相当于将原数组进行浅复制。
- 如果传入一个参数,则从起始索引处截取到原数组的结束位置
call方法
call() 方法使用一个指定的this值和单独给出的一个或多个参数来调用一个函数,简单来说就是改变this指向并调用函数。
第一个参数为函数运行时this的值,其他参数则是调用函数所需要的传入的实参。

- 创建一个
Foo构造函数,它有一个sayName方法 - 声明并初始化
obj变量 - 使用
new关键字创建一个foo对象实例 foo对象调用sayName方法时,此时this指向foo实例,输出tm- 在调用
sayName时使用call改变this指向,则this指向obj,输出hz
伪数组
JavaScript语言中伪数组具备两个特征:
- 属性名必须是数字的字符串
- 具体length属性

伪数组不具备数组独有的push、pop等方法,但我们可以通过args[index]这种方式获取指定索引位置的值,虽然很简单,但这也是将伪数组转化为真正数组的机理。
Array.prototype.slice.call(arguments)
介绍完基本概念后,我们来正式探讨下如何将一个伪数组转化为真正的数组。
我们自定义构造函数时,一般将一些公有的方法放到原型对象上,slice方法也不例外,我们来猜想一下Array.prototype.slice.(start,end)它内部的实现机理。
它大致是以如下方式进行处理:
- 在函数内部声明并初始化一个新的数组。
- 循环遍历,将
start与end之间的数组元素通过push操作添加到新数组 - 返回新数组

我们需要做的便是将函数内部的this值替换为伪数组即可,伪数组则通过args[i]语法获取目标索引的值,从而通过push方法添加到新数组,而调用时call方法并未传入其他参数,则直接浅复制伪数组元素。
既然伪数组可以转化为数组,那字符串呢?请读者小试一手。