为什么使用[].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));
作者:跳跃的皮皮虾
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。