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

只是一个小问题。

我玩弄了一下,试图实例化一个新的lenght 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; 

有没有什么办法来说明在使用填充函数时应该为每个元素创build一个新的对象? 或者我应该只是将其转换为循环?

提前致谢!

你可以先用任何值(例如undefinedfill数组,然后你就可以使用map

 var arr = new Array(2).fill().map(u => ({})); 
 var arr = new Array(2).fill().map(Object); 

被接受的答案是好的,在90%的情况下可以工作。

但是,如果您正在制作高性能的JS应用程序,并且如果使用大/大数组,则Array.map(..)会在内存和处理器使用中创build大的过载 ,因为它会创build一个数组副本。

我build议使用经典for循环:

  a = new Array(ARRAY_SIZE); for (var i = 0; i < ARRAY_SIZE; i++) { a[i] = []; } 

我testing了三个select,得到这个:

  • build议的答案(慢11倍 )。

     a = new Array(ARRAY_SIZE).fill().map(u => { return []; }); 
  • 简单循环( 最快 ):

     a = new Array(ARRAY_SIZE); for (var i = 0; i < ARRAY_SIZE; i++) { a[i] = []; } 
  • forEach(慢两倍 ):

     a = new Array(ARRAY_SIZE).fill(); a.forEach((val, i) => { a[i] = []; }) 

PS。 我用这个小提琴进行testing。