forEach on a new Array'没有达到我的预期

i_m*_*hat 6 javascript arrays higher-order-functions

我只是学习如何使用JS高阶函数(map,forEach,reduce等),并且偶然发现了混乱.我正在尝试编写一个简单的"范围"函数,但似乎无法填充我的输出数组.这是目标:

range(1, 4) // [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我明白了:

[undefined × 4]
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

 function range(num1, num2) {
      var rangeArr = new Array((num2 + 1) - num1);
      return rangeArr.map(function(e, i, arr) {return arr[i] = num1 + i});
    }
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?据我所知,这个问题似乎与我使用"新数组"的方式有关,但除此之外,我已经迷失了.

哦,这是让我困惑的部分.这很好用:

function bleck() {
    var blah = [1, 2, 3, 4];
    var x = 'wtf';
    return blah.map(function(e, i, arr) {return arr[i] = x})
}

["wtf", "wtf", "wtf", "wtf"]
Run Code Online (Sandbox Code Playgroud)

谢谢!!

voi*_*hos 4

forEach方法迭代数组的索引。有趣的是,当您通过 创建一个新数组时new Array(n),它根本不包含索引。相反,它只是设置其.length属性。

> var a = new Array(3);
> console.info(a)
[]
> console.info([undefined, undefined, undefined])
[undefined, undefined, undefined]
Run Code Online (Sandbox Code Playgroud)

MDN描述forEach并特别指出:

forEach 对数组中的每个元素执行一次提供的回调并指定值。对于已被删除或消除的索引,不会调用它。

这是一种巧妙的技术,可以获取具有空但现有索引的数组。

var a = Array.apply(null, Array(3));
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为.apply将被省略的元素“扩展”为适当的参数,并且结果最终类似于Array(undefined, undefined, undefined).