请问带对象的Array.prototype.fill()传递引用而不是新实例

带对象的Array.prototype.fill()传递引用而不是新实例

只是一个小问题。

我正在玩弄一点,并试图实例化一个新的长度x数组,其中该数组的所有元素初始化为值y

var arr = new Array(x).fill(y);

如果y的值不是对象,则此方法很有效。意思是y是一个对象,以下是正确的:

var arr = new Array(2).fill({});arr[0] === arr[1]; //is true;arr[0].test = 'string';arr[1].test === 'string'; //is also true;

有没有办法说明在使用fill-function时应该为每个元素创建一个新对象?或者我应该将其转换为循环?

提前致谢!


慕神8447489
浏览 622回答 3
3回答

临摹微笑

你可以先fill使用任何值(例如undefined)数组,然后你就可以使用map:var arr = new Array(2).fill().map(u => ({}));var arr = new Array(2).fill().map(Object);

梦里花落0921

接受的答案是好的,并且在90%的案例中都有效。但是如果你正在制作高性能的JS应用程序,并且如果使用大/大数组,则Array.map(..)会在内存和处理器使用方面产生大的重载,因为它会创建一个数组副本。我建议使用经典的for循环:&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;=&nbsp;new&nbsp;Array(ARRAY_SIZE); &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;ARRAY_SIZE;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;=&nbsp;[]; &nbsp;&nbsp;&nbsp;&nbsp;}我测试了三个替代方案,得到了这个建议答案(11倍!!!慢):a&nbsp;=&nbsp;new&nbsp;Array(ARRAY_SIZE).fill().map(u&nbsp;=>&nbsp;{&nbsp;return&nbsp;[];&nbsp;});简单循环(最快):a&nbsp;=&nbsp;new&nbsp;Array(ARRAY_SIZE);for&nbsp;(var&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;ARRAY_SIZE;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;=&nbsp;[];}forEach(慢2倍):a&nbsp;=&nbsp;new&nbsp;Array(ARRAY_SIZE).fill();a.forEach((val,&nbsp;i)&nbsp;=>&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;a[i]&nbsp;=&nbsp;[];})PS。我用这个小提琴进行测试。

绝地无双

一个高性能解决方案:&nbsp;Array.from({ length: 5 }, () => new Object())
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript