Javascript 为什么需要将对象传递给Array.from?
我不明白为什么下面提供了不同的结果,在第二个例子中,我看到人们使用下划线(u,I),但我真的不确定它的作用Javascript 为什么需要将对象传递给Array.from?,javascript,arrays,Javascript,Arrays,我不明白为什么下面提供了不同的结果,在第二个例子中,我看到人们使用下划线(u,I),但我真的不确定它的作用 让test1=Array.from(5,(v,i)=>i)//空数组 让test2=Array.from({length:5},(v,i)=>i);//[0,1,2,3,4] 我不明白为什么我需要传递一个对象来获得由前n个数字填充的数组。 有人能解释一下吗?您基本上遵循以下方法 Array.from(arrayLike, (currentValue, index) => { ..
让test1=Array.from(5,(v,i)=>i)//空数组代码>
让test2=Array.from({length:5},(v,i)=>i);//[0,1,2,3,4]
有人能解释一下吗?您基本上遵循以下方法
Array.from(arrayLike, (currentValue, index) => { ... } )
因此,
arrayLike
变量需要是字符串、映射。。。或者它应该是一个确定数组长度的对象(就像您的例子一样)。因此,在您的例子中,数组的大小由arrayLike
对象决定currentvalue
是undefined
每当arrow函数运行时,索引从0变为arrayLike.length-1
让我们先看看Array.from()方法的签名
Array.from(arrayLike,mapFn)
因此,第一个参数应该是arrayLike对象(具有非负整数长度属性的对象)。您还可以传递数组、字符串等
第二个参数是一个映射函数,它将第一个参数(arrayLike)的元素映射到回调函数返回的值
此映射函数接受具有以下签名的回调函数
回调(值、索引)
map函数创建一个新数组,其中填充了对数组的第一个参数中的每个元素调用回调函数(v,i)=>i
的结果
现在我们来看第一个案例
let test1 = Array.from(5, (v,i) => i);
这里,(v,i)=>i
是一个映射函数v
是类数组对象的元素,i
是该元素的索引。返回索引i
但是,5
既不是数组也不是类似数组的对象,5
的长度属性是未定义的。所以,map函数不映射(零)元素,并生成一个空数组。考虑以下实现
function mapFn (arrayLike, callback) {
let result = [];
for (let i = 0; i < arrayLike.length; i++) {
let mappedValue = callback(arrayLike[i], i);
result.push(mappedValue);
}
return result;
}
{length:5}
是一个类似数组的对象。map函数生成一个包含回调函数返回值的数组。回调函数返回索引。因此,[0,1,2,3,4]
在回调函数中,仅使用i
参数并从函数返回<代码>v
未使用参数。但是,它需要存在,以便可以访问第二个参数i
。所以,(u,i)
与(v,i)
相同。您可以使用任何有效的变量名来命名参数。因为它是预期的,并且arrayLike对象和数组具有长度属性。因为这就是Array.from
的工作方式。“Array.from()
允许您从1)可编辑对象(如Map
和Set
等对象)2)类似数组的对象(具有length
属性和索引元素的对象)创建数组”。数字5
不满足这两个条件。具有length
属性的对象满足第二个条件检查预期作为第一个参数传递的内容:完美解释。我从(5)中读取了该数组,创建一个长度为5的未定义数组,因此我认为数组确实存在。我还了解到,使用此方法时,键未分配(未定义),这是您说“但是,5既不是数组也不是类似数组的对象。因此,运行map函数不会生成数组”的原因?我已经编辑了我的答案。length
属性5
是undefined
。因此,map函数映射no(zero)元素并返回一个空数组。顺便说一下,newarray(5)
使用undefined
元素创建一个长度为5的数组。
let test2 = Array.from({length:5}, (v,i) => i); // [0,1,2,3,4]