关于Array.from({length: 5},(v,i)=>i)

从 sf 的一篇回答 [].copyWithin.call({length: 5, 3: 1}, 0, 3) 的回答里得到启发,想明白 Array.from({length: 5},(v,i)=>i) 如何实现了,https://segmentfault.com/q/1010000004571952


1、伪数组

Array.from() 方法从一个类似数组或可迭代对象中创建一个新的,浅拷贝的数组实例。

Array.from(arrayLike[, mapFn[, thisArg]])

其中参数:

    I、arrayLike 是想要转换成数组的伪数组对象或可迭代对象。

    II、mapFn 是新数组执行的 map() 方法,可选。

    III、thisArg 是执行 map() 时的 this 对象,可选。

这里的伪数组定义为:(从 https://www.cnblogs.com/caiyy/p/10509597.html 看来的很详细)

    I、拥有length属性,其他属性为非负整数字符串(因为对象使用[]来取值,会将数值隐式转换为字符串)
    II、不具有数组具有的方法,原型链上没有Array.prototype

显然 {length: 5} 是一个伪数组对象。


2、关于 [].copyWithin.call({length: 5, 3: 1}, 0, 3)

sf 里的回答很详细,并给出了具体代码。

/*{length: 5, 3: 1}这个对象具有一个length属性,那么其就是一个类数组对象(鸭子模式),
这个对象具有一个属性key为3的值,此对象等价于一个"数组对象" 。
那么copyWithin方法在执行的时候读取类数组对象下标3到末尾的元素,赋值到指定位置.执行简化后的copyWithin代码如下*/
(function(objectLikeArray, targetIn,startIndex){
  var target= targetIn;
  for(var i= startIndex;i<objectLikeArray.length;i++){
    //if(objectLikeArray.hasOwnProperty(i)){
    if(i in objectLikeArray){
      objectLikeArray[target]=objectLikeArray[i];
    }else{
      delete objectLikeArray[target]
    }
    target++;
}
  return objectLikeArray;  //结果:{0:1,3:1,length:5}
}({length: 5, 3: 1},0,3));

看懂了,Array.from({length: 5},(v,i)=>i) 的第一个参数应该也可以这么解。


3、关于 Array.from({length: 5},(v,i)=>i)

Array.from(obj, mapFn, thisArg) 相当于 Array.from(obj).map(mapFn, thisArg),

那么 Array.from({length: 5},(v,i)=>i) 就相当于 Array.from({length: 5}).map((v,i)=>i)。

逐步分解,先 console 了 Array.from({length: 5}) ,发现是一个长度为 5 、元素均是 undefined 的数组。再是 console 出  Array.from({length: 5}).map((v,i)=>i),结果是 [0,1,2,3,4]。

具体代码解释大概就是下面酱紫:

(function (objectLikeArray,func) {
    let arr=new Array(objectLikeArray.length).fill(undefined).map(func);
    return arr;  //新数组:[0,1,2,3,4]
})({length: 5},(v, i) => i);

今天多多少少是觉得学了点东西的。

                                                                                                                                                                                                          

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值