如何创建一个包含 1 ... N 的数组

var foo = [];

for (var i = 1; i <= N; i++) {
   foo.push(i);
}

答案

在 ES6 中,使用 Array from()keys()方法。

Array.from(Array(10).keys())
//=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

使用传播算子的较短版本。

[...Array(10).keys()]
//=> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

您可以这样做:

var N = 10; 
Array.apply(null, {length: N}).map(Number.call, Number)

结果:[0、1、2、3、4、5、6、7、8、9]

或具有随机值:

Array.apply(null, {length: N}).map(Function.call, Math.random)

结果:[0.7082694901619107、0.9572225909214467、0.8586748542729765、0.8653848143294454、0.008339877473190427、0.9911756622605026、0.8133423360995948、0.8377588465809822、0.5577575915958732、0.16363654541783035]

说明

首先,请注意Number.call(undefined, N)等同于Number(N) ,后者仅返回N稍后我们将使用该事实。

Array.apply(null, [undefined, undefined, undefined])等同于Array(undefined, undefined, undefined) ,后者产生一个三元素数组并将undefined分配给每个元素。

您如何将其概括为N 个元素?考虑一下Array()工作原理,它是这样的:

function Array() {
    if ( arguments.length == 1 &&
         'number' === typeof arguments[0] &&
         arguments[0] >= 0 && arguments &&
         arguments[0] < 1 << 32 ) {
        return [ … ];  // array of length arguments[0], generated by native code
    }
    var a = [];
    for (var i = 0; i < arguments.length; i++) {
        a.push(arguments[i]);
    }
    return a;
}

从 ECMAScript 5 开始Function.prototype.apply(thisArg, argsArray)也接受鸭子类型的类似于数组的对象作为其第二个参数。如果我们调用Array.apply(null, { length: N }) ,它将执行

function Array() {
    var a = [];
    for (var i = 0; i < /* arguments.length = */ N; i++) {
        a.push(/* arguments[i] = */ undefined);
    }
    return a;
}
Array.from({length: 5}, (v, k) => k+1); 
// [1,2,3,4,5]
Array.from({length: N}, (v, k) => k+1);  
   // [1,2,3,...,N]
var foo = new Array(45); // create an empty array with length 45

然后在您要使用它时...(未优化,例如)

for(var i = 0; i < foo.length; i++){
  document.write('Item: ' + (i + 1) + ' of ' + foo.length + '<br/>'); 
}
var foo = new Array(N);   // where N is a positive integer

/* this will create an array of size, N, primarily for memory allocation, 
   but does not create any defined values

   foo.length                                // size of Array
   foo[ Math.floor(foo.length/2) ] = 'value' // places value in the middle of the array
*/
var foo = [ ...Array(N).keys() ];
var foo = Array(N).fill().map((v,i)=>i);
Array.from({ length: N }, (v, i) => i)

在 ES6 中,您可以执行以下操作:

Array(N).fill().map((e,i)=>i+1);

http://jsbin.com/molabiluwa/edit?js,控制台

编辑:因为您已经更新了问题,所以将Array(45)更改为Array(N)

console.log(
  Array(45).fill(0).map((e,i)=>i+1)
);

// _.range([start], stop, [step])

_.range(10); // => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_.range(1, 11); // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_.range(0, 30, 5); // => [0, 5, 10, 15, 20, 25]
_.range(0, -10, -1); //  => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
_.range(0); // => []
function range(start, end) {
    var foo = [];
    for (var i = start; i <= end; i++) {
        foo.push(i);
    }
    return foo;
}
var foo = range(1, 5);
function range(start, count) {
    if(arguments.length == 1) {
        count = start;
        start = 0;
    }

    var foo = [];
    for (var i = 0; i < count; i++) {
        foo.push(start + i);
    }
    return foo;
}
[...Array(5)].map((_,i) => i);
[...Array(255).keys()].map(x => x + 1)
(new Uint8Array(255)).map(($,i) => i + 1);
for(var i = 0, arr = new Uint8Array(255); i < arr.length; i++) arr[i] = i + 1;
range(1,14000);