我在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;

当前回答

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

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

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

其他回答

var arr=[];
arr[5]=0;
alert("length="+arr.length); // gives 6

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

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

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

除了其他人的答案之外,另一个聪明的方法是使用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 => /* ... */ )

假设数组的长度是恒定的。在Javascript中,我们这样做:

const intialArray=新数组(指定值);

(这可能是更好的评论,但太长了)

所以,读了这篇文章后,我很好奇预分配是否真的更快,因为理论上应该更快http://www.html5rocks.com/en/tutorials/speed/v8/.

所以我仍然不确定,所以我把它放在了测试中。事实证明,它似乎更慢。

var time = Date.now();
var temp = [];
for(var i=0;i<100000;i++){
    temp[i]=i;
}
console.log(Date.now()-time);


var time = Date.now();
var temp2 = new Array(100000);
for(var i=0;i<100000;i++){
    temp2[i] = i;
}
console.log(Date.now()-time); 

经过几次偶然运行后,此代码产生以下结果:

$ node main.js 
9
16
$ node main.js 
8
14
$ node main.js 
7
20
$ node main.js 
9
14
$ node main.js 
9
19