有没有更紧凑的方式来进行这种初始化?
for (var i = 0; i < arraySize; i++) array[i] = value;
Answers:
while(arraySize--) array.push(value);
没有初始化(我知道)
更新资料
自从4年前发布此答案以来,人们似乎一直在这里回来寻找此答案。为了进行基准测试,我使用了一些不同的解决方案制作了一个JSPerf。
上面的解决方案虽然简短,但却不是最快的解决方案。坚持相同的短样式,但性能更好:
while(size--) array[size] = value;
2016年2月 更新用一个包含更多测试用例的新版本更新了JSPerf。
如果性能无关紧要,并且您想要单线:
var value = 1234, // can be replaced by a fixed value
size = 1000, // can be replaced by a fixed value
array = Array.apply(null,{length: size}).map(function() { return value; });
一种性能更高的解决方案(一个行,一个肮脏的行): 请注意:这将替换范围中存在的value,size和i变量
for(var i = 0, value = 1234, size = 1000, array = new Array(1000); i < size; i++) array[i] = value;
while比forJavaScript慢2倍,并且像类型转换这样的简单检查if (number)也比if (number === 0)类型转换慢(这也适用于布尔值,字符串和null)。我的jsPerf测试教会了我这一点。
一种简单的方法是:
var arr = Array(arraySize).fill(value);
例如将arr = Array [ 0, 0, 0, 0, 0 ]ifarraySize == 5和value == 0。
我认为这很好,简短而优雅:
// assuming `value` is what you want to fill the array with
// and `arraySize` is the size of the array
Array(arraySize).fill(value);
在效率和可重用性的一次性使用场景中,OP似乎是紧凑的。对于其他寻求效率的人,这里还没有提到优化。由于您事先知道了数组的长度,因此在分配值之前,请先进行设置。否则,将要动态地反复调整阵列的大小-不理想!
function initArray(length, value) {
var arr = [], i = 0;
arr.length = length;
while (i < length) { arr[i++] = value; }
return arr;
}
var data = initArray(1000000, false);
for速度是的2倍while。
这可能不会比上面的任何技术都要好,但是很有趣。
var a = new Array(10).join('0').split('').map(function(e) {return parseInt(e, 10);})
var arr = (new Array(5)).map(() => 1);不起作用吗?
new Array(5)当我们做一个映射之后,我们不是在数组上操作吗?此外,这[1,undefined,3].map(() => 5)按预期工作。它不会跳过undefined
这是一个老问题,但是我在现代JS中使用了这个问题:
[...new Array(1000000)].map(()=>42);
为了提高效率,我会避免push。这么简单
for (var i = 0; i < arraySize; i++) array[i] = value;
对于IE10:
array = new Array(arraySize);
for (var i = 0; i < arraySize; i++) array[i] = value;
编辑:按照注释中的讨论进行修改。
for (var i = 0; i < arraySize; ++i)具有与您的代码几乎相同的性能,但看起来更干净。但是while (arraySize--)慢了2倍。
array比开始更有效array[0]。
如果需要多次执行,可以随时编写一个函数:
function makeArray(howMany, value){
var output = [];
while(howMany--){
output.push(value);
}
return output;
}
var data = makeArray(40, "Foo");
而且,仅出于完整性考虑(摆弄内置对象的原型通常不是一个好主意):
Array.prototype.fill = function(howMany, value){
while(howMany--){
this.push(value);
}
}
因此,您现在可以:
var data = [];
data.fill(40, "Foo");
更新:我刚刚看过您关于arraySize常数或文字的注释。如果是这样,只需将所有while(howMany--)旧内容替换为old old即可for(var i=0; i<howMany; i++)。
在飞机上探索数组方法时偶然发现了这一点。:)
var initializedArray = new Array(30).join(null).split(null).map(function(item, index){
return index;
});
.map()而null为赢!我喜欢null,因为在字符串中输入“ 0”或其他任何值都令人困惑。我认为这是很明确的,因为我们正在做一些不同的事情。
请注意,将.map()跳过未初始化的值。这就是为什么new Array(30).map(function(item, index){return index});不起作用。新的.fill()优选方法如果有的话,但是浏览器支持应当注意作为2015年8月23日。
桌面(基本支持)
从MDN:
[1, 2, 3].fill(4); // [4, 4, 4]
[1, 2, 3].fill(4, 1); // [1, 4, 4]
[1, 2, 3].fill(4, 1, 2); // [1, 4, 3]
[1, 2, 3].fill(4, 1, 1); // [1, 2, 3]
[1, 2, 3].fill(4, -3, -2); // [4, 2, 3]
[1, 2, 3].fill(4, NaN, NaN); // [1, 2, 3]
Array(3).fill(4); // [4, 4, 4]
[].fill.call({ length: 3 }, 4); // {0: 4, 1: 4, 2: 4, length: 3}
[...Array(30)].map((_, i) => i);