从 sf 的一篇回答 [].copyWithin.call({length: 5, 3: 1}, 0, 3) 的回答里得到启发,想明白 Array.from({length: 5},(v,i)=>i) 如何实现了,https://segmentfault.com/q/1010000004571952。
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} 是一个伪数组对象。
sf 里的回答很详细,并给出了具体代码。
/*{length: 5, 3: 1}这个对象具有一个length属性,那么其就是一个类数组对象(鸭子模式),
这个对象具有一个属性key为3的值,此对象等价于一个"数组对象" 。
那么copyWithin方法在执行的时候读取类数组对象下标3到末尾的元素,赋值到指定位置.执行简化后的copyWithin代码如下*/
(function(objectLikeArray, targetIn,startIndex){
var target= targetIn;
for(var i= startIndex;i
看懂了,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);
今天多多少少是觉得学了点东西的。