Javascript 'Array.from({length:5},(v,i)=>;i)`如何工作?

Javascript 'Array.from({length:5},(v,i)=>;i)`如何工作?,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我可能在这里遗漏了一些明显的东西,但是有人能一步一步地分解为什么Array.from({length:5},(v,I)=>I)返回[0,1,2,3,4] 我不太明白为什么会这样 var arr1=Array.from({ 长度:5//使用未定义的值创建5个索引 }, 函数(v,k){//使用v(value)[未定义]和k(ey)[0到4]在所述索引上运行map函数 返回k;//返回k(ey)作为该索引的值 } ); 控制台日志(arr1)当Javascript检查是否可以调用某个方法时,它使用

我可能在这里遗漏了一些明显的东西,但是有人能一步一步地分解为什么
Array.from({length:5},(v,I)=>I)
返回
[0,1,2,3,4]

我不太明白为什么会这样

var arr1=Array.from({
长度:5//使用未定义的值创建5个索引
},
函数(v,k){//使用v(value)[未定义]和k(ey)[0到4]在所述索引上运行map函数
返回k;//返回k(ey)作为该索引的值
}
);

控制台日志(arr1)当Javascript检查是否可以调用某个方法时,它使用。这意味着当您想从某个对象调用方法
foo
,该对象的类型应该是
bar
,那么它不会检查该对象是否真的是
bar
,而是检查它是否有方法
foo

因此,在JS中,可以执行以下操作:

let fakeArray = {length:5};
fakeArray.length //5
let realArray = [1,2,3,4,5];
realArray.length //5
第一个类似于伪javascript数组(具有属性
length
)。当
Array.from
获取属性
length
(本例中为5)的值时,它将创建一个长度为5的实数数组

这种伪数组对象通常称为arrayLike

第二部分只是一个arrow函数,它用索引值(第二个参数)填充数组

这种技术对于模拟某些对象进行测试非常有用。例如:

let ourFileReader = {}
ourFileReader.result = "someResult"
//ourFileReader will mock real FileReader

在developer.mozilla.org关于array.from的页面上,没有人告诉我们,
mapFn
可以接受两个参数,例如
v
k
v
是当前元素的值,
k
是元素的索引。这就是交易

{length:5}
创建一个没有任何值的对象,但是
length
等于
5


(v,k)=>k
是一个箭头函数,用于将当前元素的索引号分配给该元素值。

箭头函数中的第二个参数始终是带有数组的索引。from()方法

x=Array.from({length:5},(v,i,k)=>k)
console.log(x)
//预期输出数组(5)[未定义,未定义,未定义,未定义,未定义]
x=Array.from({length:5},(v,i,k)=>v)
console.log(x)
//预期输出数组(5)[未定义,未定义,未定义,未定义,未定义]
x=Array.from({length:5},(v,i,k)=>i)
console.log(x)
//预期输出数组(5)[0,1,2,3,4]
x=Array.from({length:5},()=>[])
console.log(x)
//预期输出阵列(5)[]、[]、[]、[]、[]、[]、[]、[]]
x=Array.from({length:5},()=>{})
console.log(x)

//预期输出数组(5)[未定义,未定义,未定义,未定义,未定义]
您是否完整阅读了mdn链接?您提供的链接对此进行了解释!使用Array.from()可以从以下对象创建数组:类似数组的对象(具有长度属性和索引元素的对象)和mapFn可选。映射函数来调用数组中的每个元素。我想你应该阅读这篇文章来理解
(v,k)=>k
函数(v,k){return k;}
:这是为了理解使用5个未定义元素创建对象:看起来像
数组。from
还调用隐式
数组。prototype.fill()
或者做一些其他的魔术。因为如果我们创建一个稀疏数组,比如
var arr=[];arr.length=5我们无法映射该数组,即使我们(理论上)有5个未定义的值。谢谢,这是我一直在寻找的答案-我以前不知道duck类型。诚然,我的问题措辞不恰当。