Javascript 使用单个值初始化数组

Javascript 使用单个值初始化数组,javascript,Javascript,有没有更紧凑的方法来进行这种初始化 for (var i = 0; i < arraySize; i++) array[i] = value; for(var i=0;i

有没有更紧凑的方法来进行这种初始化

for (var i = 0; i < arraySize; i++) array[i] = value;
for(var i=0;i
没有初始化(据我所知)


更新

自从4年前发布这个答案以来,人们似乎一直在这里寻找这个答案。出于基准测试的目的,我用一些不同的解决方案做了一个

上面的解决方案虽然简短,但不是最快的。要坚持相同的短款风格,但性能更好:

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; });
更高性能的解决方案(在一条脏线中): 请注意:这将替换范围中现有的值、大小和i变量

for(变量i=0,值=1234,大小=1000,数组=新数组(1000);i
如果需要多次执行此操作,则始终可以编写函数:

function makeArray(howMany, value){
    var output = [];
    while(howMany--){
        output.push(value);
    }
    return output;
}

var data = makeArray(40, "Foo");
而且,仅仅为了完整性(摆弄内置对象的原型通常不是一个好主意):

因此,您现在可以:

var data = [];
data.fill(40, "Foo");


更新:我刚刚看到你关于
arraySize
是常量或文本的说明。如果是这样的话,只需将所有
while(howMany--)
替换为好的
for(var i=0;i为了提高效率,我将避免
推送

for (var i = 0; i < arraySize; i++) array[i] = value; 
for(var i=0;i
对于IE10:

array = new Array(arraySize); 
for (var i = 0; i < arraySize; i++) array[i] = value; 
array=新数组(arraySize);
对于(var i=0;i

编辑:根据评论中的讨论进行了修改。

在单次使用场景中,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);
函数initArray(长度、值){
var arr=[],i=0;
arr.length=长度;
而(i
这不可能比上述任何技术都好,但很有趣

var a = new Array(10).join('0').split('').map(function(e) {return parseInt(e, 10);})

这不是很紧凑,但可以说更直接

array = Array.apply(null, new Array(arraySize)).map(function () {return value;});

一个简单的方法是:

var arr = Array(arraySize).fill(value);

例如,如果
arraySize==5
value==0
,则会使
arr=Array[0,0,0,0,0]

在平面上探索数组方法时偶然发现了这个问题。。哦,我们无聊时会去哪些地方。)

.map()
null
获胜!我喜欢null,因为用“0”或任何其他值传入类似up top的字符串会令人困惑。我认为这更清楚地表明,我们正在做一些不同的事情

请注意,
.map()
跳过未初始化的值。这就是为什么
newarray(30).map(函数(项,索引){returnindex})不起作用。如果可用,则首选新的
.fill()
方法,但应注意从2015年8月23日起对浏览器的支持

桌面(基本支持)

  • 铬45(36)
  • 火狐(壁虎)31(31)
  • 不支持Internet Explorer
  • Opera不受支持
  • Safari 7.1
发件人:


这是一个老问题,但我在现代JS中使用:

[...new Array(1000000)].map(()=>42);

在许多情况下,“arraySize”是不可变的(可以是常量或文字,或者-我知道,糟糕的做法-“array.length”)。通过将大小表示为一个变量,我使这一点变得不清楚。true:“for(var I=arraySize;I--;)array.push(value);”然后:-)但我想你已经明白了你是对的-这种语法确实减少了五个字符。;-)<对于JavaScript中的
,code>while
慢2倍,而像
if(number)
这样的简单检查也比
if(number==0)
慢,因为类型转换(这也适用于布尔、字符串和null)。我的jsPerf测试教会了我这一点:新数组(len).fill(0)<代码>for(var i=0;i
的性能几乎与代码相同,但看起来更干净。但是
while(arraySize--)
的速度要慢两倍。是的,但是
array
的内存分配比启动
array[0]
更有效。否。如果从末尾开始初始化数组,将在内部使用哈希表,但是如果从0开始初始化数组,并且只有顺序索引,则将使用真正的数组(至少在V8中)。JavaScript不分配(最高索引+1)元素,它只分配初始化的元素。参考[Slide 54]()在JavaScript中,
速度是
的2倍,而
的速度是
的2倍。我不会说这是那么精确:当然,你不希望总是只使用这两种方法,这会破坏它们的用途。解释器/编译器的工作应该是尽可能地加快速度,而不是你的。但即使这样也不总是正确的。IE不支持:@Perry。你知道,当市场占有率为6%的浏览器不支持该标准时,如果值是一个对象,则浏览器会小心地使用fill函数,因为在整个数组中可能有相同的对象,这可能会导致不必要的结果。你能解释为什么
var arr=(新数组(5)).map() => 1);不起作用?map()方法只对数组中的值起作用。它跳过未定义的元素。所以在
新建数组(5)
之后,当我们进行映射时,我们不是在数组上操作吗?另外,这个
[1,未定义,3].map(()=>5)
也可以正常工作。它不会跳过mozilla文档中的
undefined
:map为数组中的每个元素、顺序和构造调用一次提供的回调函数
array = Array.apply(null, new Array(arraySize)).map(function () {return value;});
var arr = Array(arraySize).fill(value);
var initializedArray = new Array(30).join(null).split(null).map(function(item, index){
  return index;
});
[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}
[...new Array(1000000)].map(()=>42);