为什么使用[].slice.call(fakeArray)可以将一个伪数组转换为数组?

call方法会改变数组slice方法中的this指向,并立即执行slice方法,slice方法会对this中的数据(此时this的数据就是fakeArray对象的数据)进行取值拷贝操作

手写一个简单的slice,来理解它的执行过程:

1.接收参数start 和 end,当无参数时,start默认为0,end默认取length的值

2.循环操作,通过索引获取对应的数据,push到一个新数组中

3.return出新数组

 1 Array.prototype.Myslice = function (start,end){
 2   console.log('模拟slice,this→',this);
 3   // 判断begin是否存在,不存在的话赋值为0
 4   start = start || 0;   
 5   // 获取call进来的对象的length
 6   end = end || this.length;    
 7   let result = [];
 8   // 取出start至end中间的数据,浅克隆到新数组中
 9   for (let i = start; i < end; i++) {
10     result.push(this[i])
11   }
12   return result;
13 }
14 
15 let fakeArray = {
16     length:3,
17     "0":"第一位",
18     "1":"第二位",
19     "2":"第三位"
20 }
21 console.log('模拟slice,转换结果→',[].Myslice.call(fakeArray));

 

posted @ 2020-06-10 18:25  跳跃的皮皮虾  阅读(380)  评论(0编辑  收藏  举报