在本教程中,我们将学习如何创建一个包含 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 位整数,用于指定数组中的元素数。