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

当前回答

为什么要初始化长度?理论上没有必要这样做。它甚至会导致混乱的行为,因为所有使用该长度来确定数组是否为空的测试都会报告该数组不为空。一些测试表明,如果随后填充数组,则设置大数组的初始长度可能会更有效,但每个浏览器的性能增益(如果有的话)似乎有所不同。jsLint不喜欢new Array(),因为构造函数不明确。新阵列(4);创建长度为4的空数组。但是新阵列('4');创建包含值“4”的数组。

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

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

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

其他回答

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

var x = [,,,,];

在大多数答案中,建议填充数组,因为否则“无法对其进行迭代”,但这不是真的。您可以迭代空数组,但不能使用forEach。While循环、for of循环和for i循环工作正常。

const count = Array(5);

不起作用。

console.log('---for each loop:---');
count.forEach((empty, index) => {
    console.log(`counting ${index}`);
});

这些工作:

console.log('---for of loop:---');
for (let [index, empty] of count.entries()) {
  console.log(`counting for of loop ${index}`);
}

console.log('---for i loop:---');
for (let i = 0, il = count.length; i < il; ++i) {
  console.log(`counting for i loop ${i}`);
}

console.log('---while loop:---');
let index = 0;
while (index < count.length) { 
  console.log(`counting while loop ${index}`); 
  index++; 
}

用上面的例子检查这个小提琴。

另外,angulars*ngFor在空数组中也很好:

<li *ngFor="let empty of count; let i = index" [ngClass]="
  <span>Counting with *ngFor {{i}}</span>
</li>
var arr=[];
arr[5]=0;
alert("length="+arr.length); // gives 6

Array(5)为您提供了一个长度为5但没有值的数组,因此您无法对其进行迭代。Array.apply(null,Array(5)).map(function(){})为您提供了一个长度为5且未定义为值的数组,现在可以对其进行迭代。Array.apply(null,Array(5)).map(函数(x,i){return i;})为您提供一个长度为5、值为0,1,2,3,4的数组。Array(5).forEach(警报)不执行任何操作,Array.apply(null,Array(5个)).forEach(警报)为您提供5个警报ES6为我们提供了Array.from,所以现在您也可以使用Array.from(Array(5)).forEach(alert)如果您想用某个值进行初始化,那么最好知道。。。来自('abcde')的数组,来自('x'。重复(5))的数组从({length:5},(v,i)=>i)//得到[0,1,2,3,4]

ES6引入了Array.from,它允许您从任何“类数组”或可迭代对象创建Array:

Array.from({length: 10}, (x, i) => i);
// [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

在这种情况下,{length:10}表示“类数组”对象的最小定义:一个只定义了长度属性的空对象。

Array.from允许第二个参数映射到结果数组上。