js伪数组转数组原理

975 阅读1分钟

我们在前端开发过程中,经常会有这中情况,将一个伪数组转成数组

var fackArr = {
0:'abc',
1:'def',
2:'igk',
length: 3
}

一般都会用这样的方式:

var arr = [].slice.call(fackArr)

就得到了真正的数组,但是却没能明白为什么这样写。

要知道其中的原理,我们就必须要知道slice 的实现原理,下面我们自己来定义一个mySlice方法:

Array.prototype.mySlice = function(){
  var start = 0;
  var end = this.length
  if (arguments.length === 1) {
    start = arguments[0]
  } else if (arguments.length === 2) {
    start = arguments[0]
    end = arguments[1]
  }

  var tem = []
  for (var i = start; i < end; i++) {
    tem.push(this[i])
  }
  return tem;
}

var fackArr = {
  0: 'abc',
  1: 'def',
  2: 'ghi',
  length: 3
}

var realArr =  [].mySlice.call(fackArr)
console.log(realArr)// ['abc', 'def', 'ghi']

slice方法有两个可选参数startend,如果不传任何参数,默认从第0位开始截取,一直到最后一位,这样相当于复制了一个原数组返回新数组;如果传一个参数,从start开始截取,一直到length-1位;如果传2个参数,从start开始到end结束,不包含end位置,然后返回新的数组,而call改变this指向,在执行这句代码的时候tem.push(this[i])刚好可以取到伪数组中i对应的value值,放到临时数组tem中,最后得到我们想要的真正的数组。