带对象的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一个新的对象? 或者我应该只是将其转换为循环?
提前致谢!
你可以先用任何值(例如undefined
) fill
数组,然后你就可以使用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。