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