我在玩一下,试图实例化一个长度为x
的新数组,其中该数组的所有元素都初始化为值y
:
var arr = new Array(x).fill(y);
如果y
的值不是对象,那么这个方法可以很好地工作。 也就是说,如果y
是一个对象,那么以下条件成立:
var arr = new Array(2).fill({}); arr[0] === arr[1]; //结果为true; arr[0].test = 'string'; arr[1].test === 'string'; //结果也为true;
有没有办法在使用fill函数时声明每个元素都应该创建一个新对象?还是我应该将其转换为循环?
接受的答案很好,在90%的情况下都能工作。
但是,如果你正在制作高性能的JS应用程序,并且使用大型/巨大的数组,Array.map(..)会在内存和处理器使用方面创建大量的负载,因为它会创建数组的副本。
我建议使用经典的for循环:
我测试了六种替代方案,得到了以下结果:
Array.map(),如上所述(比原来慢11倍!):
for循环,最好的选择(最快):
forEach(慢6倍):
[更新于2020-08-27] Ilias Karim提出了另一种方法
Array.from(慢30倍!)- 在性能方面显然更差,尽管语法最好 :(
[..Array(..)](慢5倍!)
Array.push(..),在性能方面排名第二(慢2倍!)
附注:我在这个fiddle上进行了测试。
您可以首先使用任何值(例如
undefined
)填充数组,然后您就可以使用map
: