首页 文章

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

提问于
浏览
10

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

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/from

我不明白为什么这样做有效

3 回答

  • 11

    在关于array.from的developer.mozilla.org页面上,没有人告诉我们“mapFn”可以带2个参数,例如v和k:v是当前元素的值,k是元素的索引 . 所以这是交易 .

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

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

  • 5
    var arr1 = Array.from({
        length: 5 // Create 5 indexes with undefined values
      },
      function(v, k) { // Run a map function on said indexes using v(alue)[undefined] and k(ey)[0 to 4]
        return k; // Return k(ey) as value for this index
      }
    );
    console.log(arr1);
    
  • 3

    Javascript使用duck-typing . 这意味着当你从某个对象调用方法 foo 时,该对象应该是 bar 类型,它不会检查这个对象是否真的是 bar 但它会检查它是否有方法 foo .

    总结一下:

    let fakeArray = {length:5};
    fakeArray.length //5
    let realArray = [1,2,3,4,5];
    realArray.length //5
    

    第一个是"fake" javascript数组(其属性为 length ) . 当 Array.from 检查属性 length 时,它返回5,因此它创建长度为5的实数 . 您可以调用 fakeArray object“ arrayLike ” .

    第二部分就是lamba,它使用索引值(第二个参数)填充数组 .

    这种技术对于模拟一些测试对象非常有用 . 例如:

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

相关问题