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

在本教程中,我们将学习如何创建一个包含 1 到 n 的 JavaScript 数组。

让我们创建一个指定长度的新数组。

构造函数将 Array 的 length 属性设置为给定的长度,而不设置键。

接下来,当我们要使用它时,例如未优化,请执行以下操作:

let arr = new Array(10); //create an empty array with a length 10
for (let i = 0; i < arr.length; i++) {
  console.log('Item: ' + (i + 1) + '  of   ' + arr.length);
}

新数组不会创建 10 个元素的数组。
它创建一个长度为 10 的空数组。
这就是为什么在这种情况下不会应用 forEach() 和 map() 方法的原因。

让我们讨论解决这个问题的另一种方法。
我们可以执行以下操作:

let n = 10;
let arr = Array.apply(null, {
  length: n
}).map(Number.call, Number);
console.log(arr);
let n = 10;
let arr = Array.apply(null, {
  length: n
}).map(Function.call, Math.random)
console.log(arr);

Number.call(undefined, n) 等于返回 n 的 Number(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) {
    return […]; //array of length arguments[0]
                //generated by native code
  }
  let arr = [];
  for (let i = 0; i < arguments.length; i++) {
    arr.push(arguments[i]);
  }
  return arr;
}

现在让我们调用 Array.apply(null, { length: n }):

function Array() {
  let a = [];
  for (let i = 0; i < /* arguments.length = */n; i++) {
    a.push( /* arguments[i] = */undefined);
  }
  return a;
}

现在我们有一个 n 元素数组,其中每个元素都设置为未定义。

当我们在其上调用 .map(callback, thisArg) 时,它会将每个元素设置为 callback.call(thisArg, element, index, array) 的结果。

Array.apply(null, {length: n}) 和 Array(n) 表达式都会产生一个包含未定义元素的 n 元素数组。
根据 map() 文档,第一个表达式会将每个元素设置为 undefined,而在第二个表达式中,每个元素都从未设置过。

回调只对已赋值的 Array 索引调用,因此 Array(n) 无效; Array(n).map(Number.call, Number) 将产生一个长度为 n 的未初始化数组。

Array() 构造函数

Array() 构造函数创建 Array 对象。
JavaScript 数组是使用给定元素创建的,除非将单个参数传递给 Array 构造函数并且是数字。
数组长度属性返回一个无符号的 32 位整数,用于指定数组中的元素数。

日期:2020-06-02 22:16:15 来源:oir作者:oir