我在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;
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允许第二个参数映射到结果数组上。
请人们不要放弃你的旧习惯。分配内存一次,然后处理该数组中的条目(与以前一样),与在数组增长时多次分配内存(这是系统在使用其他建议方法时不可避免的做法),两者在速度上存在很大差异。
当然,这些都不重要,除非你想用更大的阵列做些酷的事情。然后它就开始了。
鉴于目前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循环等。。
在大多数答案中,建议填充数组,因为否则“无法对其进行迭代”,但这不是真的。您可以迭代空数组,但不能使用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>