如何在JavaScript中初始化数组的长度?

2022-08-29 22:26:47

我读过的大多数关于 JavaScript 数组的教程(包括 w3schoolsdevguru)都建议,你可以通过使用语法将整数传递给 Array 构造函数来初始化具有一定长度的数组。var test = new Array(4);

在我的js文件中大量使用此语法后,我通过jsLint运行了其中一个文件,它吓坏了:

错误:第 1 行第 22 个字符出现问题:预期的“)”,而是看到“4”。
var test = new Array(4);
第 1 行字符 23 处的问题:预期为“;”,而是看到“)”。
var test = new Array(4);
第 1 行字符 23 处的问题:需要一个标识符,但看到“)”。

在通读了 jsLint 对其行为的解释之后,看起来 jsLint 并不喜欢语法,而是更喜欢声明数组。new Array()[]

所以我有几个问题:

首先,为什么?我是否改用该语法会带来任何风险?是否有我应该注意的浏览器不兼容问题?new Array()

其次,如果我切换到方括号语法,有没有办法声明一个数组并将其长度全部设置在一行上,或者我必须做这样的事情:

var test = [];
test.length = 4;

答案 1
  • Array(5)给你一个长度为5但没有值的数组,因此你不能迭代它。

  • Array.apply(null, Array(5)).map(function () {})给你一个长度为5且未定义为值的数组,现在它可以迭代。

  • Array.apply(null, Array(5)).map(function (x, i) { return i; })为您提供一个长度为 5 且值为 0,1,2,3,4 的数组。

  • Array(5).forEach(alert)什么都不做,给你5个警报Array.apply(null, Array(5)).forEach(alert)

  • ES6给我们,所以现在你也可以使用Array.fromArray.from(Array(5)).forEach(alert)

  • 如果你想用一个特定的值初始化,这些都是很好的知道...

    Array.from('abcde')Array.from('x'.repeat(5))Array.from({length: 5}, (v, i) => i) // gives [0, 1, 2, 3, 4]


答案 2
  1. 为什么要初始化长度?从理论上讲,没有必要这样做。它甚至可能导致令人困惑的行为,因为所有使用 的测试都会报告数组是否为空。
    一些测试表明,如果数组在之后被填充,则设置大型数组的初始长度可能会更有效,但性能提升(如果有的话)似乎因浏览器而异。length

  2. jsLint 不喜欢,因为构造函数是模棱两可的。new Array()

    new Array(4);
    

    创建长度为 4 空数组。但

    new Array('4');
    

    创建一个包含值 的数组。'4'

关于您的评论:在JS中,您不需要初始化数组的长度。它动态增长。您可以将长度存储在某个变量中,例如

var data = [];
var length = 5; // user defined length

for(var i = 0; i < length; i++) {
    data.push(createSomeObject());
}