Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么需要将对象传递给Array.from?_Javascript_Arrays - Fatal编程技术网

Javascript 为什么需要将对象传递给Array.from?

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) => { ..

我不明白为什么下面提供了不同的结果,在第二个例子中,我看到人们使用下划线(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) => { ... } )
    

    因此,
    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]