我在JavaScript中读到的大多数关于数组的教程(包括w3schools和devguru)都建议,通过使用vartest=newArray(4)将整数传递给array构造函数,可以初始化具有一定长度的数组;语法。

在我的js文件中大量使用了这种语法后,我通过jsLint运行了其中一个文件,结果发现:

错误:第1行第22个字符出现问题:应为“)”,但看到的却是“4”。var test=新阵列(4);第1行第23个字符出现问题:应为“;”而是看到“)”。var test=新阵列(4);第1行第23个字符出现问题:应为标识符,但看到的却是“)”。

在阅读了jsLint对其行为的解释之后,jsLint似乎并不真正喜欢新的Array()语法,而是在声明数组时更喜欢[]。

所以我有几个问题:

首先,为什么?改用新的Array()语法是否会有风险?我是否应该注意到浏览器不兼容?

第二,如果我切换到方括号语法,是否有任何方法声明数组并将其长度全部设置在一行上,或者我必须这样做:

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

当前回答

这将把长度属性初始化为4:

var x = [,,,,];

其他回答

数组构造函数有一个不明确的语法,JSLint毕竟会伤害你的感情。

此外,如果示例代码损坏,第二个var语句将引发SyntaxError。您正在设置数组测试的属性长度,因此不需要另一个变量。

就您的选择而言,array.length是唯一“干净”的选项。问题是,为什么首先需要设置大小?尝试重构代码以消除这种依赖。

我很惊讶,没有一个功能性的解决方案可以让你设置一行的长度。以下内容基于UndercoreJS:

var test = _.map(_.range(4), function () { return undefined; });
console.log(test.length);

由于上面提到的原因,除非我想将数组初始化为特定值,否则我会避免这样做。有趣的是,还有其他实现范围的库,包括Lo-dash和Lazy,它们可能具有不同的性能特征。

请人们不要放弃你的旧习惯。分配内存一次,然后处理该数组中的条目(与以前一样),与在数组增长时多次分配内存(这是系统在使用其他建议方法时不可避免的做法),两者在速度上存在很大差异。

当然,这些都不重要,除非你想用更大的阵列做些酷的事情。然后它就开始了。

鉴于目前JS中似乎仍然没有设置数组初始容量的选项,我使用以下方法。。。

var newArrayWithSize = function(size) {
  this.standard = this.standard||[];
  for (var add = size-this.standard.length; add>0; add--) {
   this.standard.push(undefined);// or whatever
  }
  return this.standard.slice(0,size);
}

需要权衡:

该方法在第一次调用函数时花费的时间与其他方法一样长,但在以后的调用中花费的时间很少(除非要求更大的数组)。标准阵列永久保留的空间与您所要求的最大阵列一样多。

但如果它与你正在做的事情相吻合,就会有回报。非正式计时看跌期权

for (var n=10000;n>0;n--) {var b = newArrayWithSize(10000);b[0]=0;}

以相当快的速度(假设n=1000000,大约需要5秒),以及

for (var n=10000;n>0;n--) {
  var b = [];for (var add=10000;add>0;add--) {
    b.push(undefined);
  }
}

在一分钟以上(在同一个铬控制台上,10000台的速度大约为90秒,或者大约慢2000倍)。这不仅仅是分配,还有10000次推送、for循环等。。

最短:

设arr=[…数组(10)];控制台日志(arr);

除了其他人的答案之外,另一个聪明的方法是使用Float32Array创建一个数组并对其进行迭代。

为此,从Float32Array创建一个具有所需长度的实例,如下所示:

new Float32Array(5)

此代码返回一个数组,您可以使用array.from()将其转换为数组:

Array.from(new Float32Array(5)) // [0, 0, 0, 0, 0]

您还可以使用fill()更改项的值:

Array.from(new Float32Array(5).fill(2)) // [2, 2, 2, 2, 2]

当然,您可以对其进行迭代:

Array.from(new Float32Array(5)).map(item => /* ... */ )