Javascript ES6-生成一个数字数组

Javascript ES6-生成一个数字数组,javascript,ecmascript-6,Javascript,Ecmascript 6,通过谷歌搜索,我找到了两种解决方案: var data=[…数组(10).keys(); 控制台日志(数据); var data1=Array(8).fill().map((_,i)=>i); console.log(data1)以下是一个在codepen中工作的简单解决方案: Array.from(Array(10).keys()) 需要明确的是,Array.from()和Array.keys()需要ES6 polyfill才能在所有浏览器中工作。问题似乎在于codepen使用babel

通过谷歌搜索,我找到了两种解决方案:

var data=[…数组(10).keys();
控制台日志(数据);
var data1=Array(8).fill().map((_,i)=>i);

console.log(data1)以下是一个在codepen中工作的简单解决方案:

Array.from(Array(10).keys())

需要明确的是,
Array.from()
Array.keys()
需要ES6 polyfill才能在所有浏览器中工作。

问题似乎在于codepen使用babel es2015 lose预编译代码

在这种模式下,您的

[...Array(10).keys()];
变成

[].concat(Array(10).keys());
这就是为什么你会看到一个包含迭代器的数组

使用es2015模式,您将获得

function _toConsumableArray(arr) {
  if (Array.isArray(arr)) {
    for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
      arr2[i] = arr[i];
    }
    return arr2;
  } else {
    return Array.from(arr);
  }
}
[].concat(_toConsumableArray(Array(10).keys()));
function\u to consumablearray(arr){
if(数组isArray(arr)){
对于(变量i=0,arr2=Array(arr.length);i
这将按照期望的方式运行


有关模式的更多信息,请参阅。

通过实际示例浏览Array.from

Array.from
还接受用作映射函数的第二个参数

let out=Array.from(数组(10),(x)=>x);
控制台。注销;

//[0,1,2,3,4,5,6,7,8,9]
进一步细化,生成一个值从1开始的数组:

Array.from(Array(10).keys(), n => n + 1)

这里的所有其他答案都会创建一个临时的中间数组,这是不必要的

Array.from({ length: 10 }, (_, i) => i)

这本质上是一个映射函数,您可以从数组索引映射到任意数量的元素。

这里有一个
范围
函数,它采用
开始
结束
,以及
步骤
参数。它返回一个数组,从
开始
结束
编号(但不包括该编号),增量为
步长

const range=(开始、结束、步骤)=>{
返回Array.from(Array.from(Array(Math.ceil((end-start)/step)).keys()),x=>start+x*step);
}
日志(范围(1,10,1));
//[1, 2, 3, 4, 5, 6, 7, 8, 9]
log(范围(0,9,3));
//[0, 3, 6]
日志(范围(10,30,5));

//[10,15,20,25]
如果我运行
var data=[…数组(10).keys()]在我的浏览器(最新稳定的Chrome)中,我看到列出的数字。如果我只做
Array(10).keys()
,我会看到
ArrayIterator
。这和codepen有关吗@它与巴别塔有关,巴别塔在特定的代码库中使用,它与CodePen对巴别塔的使用有关。我不确定他们运行的是什么版本,但如果你禁用Babel预处理器,一切都会正常。您可以运行此代码,但仍然可以看到预期的结果。谢谢。ES6功能不需要babel吗?那“noob代码”有什么错?我认为它更具可读性。这是迄今为止最优雅的方法,也可能是使用具有长度属性的对象作为iterable和集成在同一个“循环”中的map fn最有效的方法