为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

森栏 2019-07-24 20:47:10
带对象的Array.prototype.fill()传递引用而不是新实例只是一个小问题。我正在玩弄一点,并试图实例化一个新的长度x数组,其中该数组的所有元素初始化为值yvar 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时应该为每个元素创建一个新对象?或者我应该将其转换为循环?提前致谢!
查看完整描述

3 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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

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


查看完整回答
反对 回复 2019-07-24
?
慕村225694

TA贡献1880条经验 获得超4个赞

接受的答案是好的,并且在90%的案例中都有效。

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

我建议使用经典的for循环:

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

我测试了三个替代方案,得到了这个

  • 建议答案(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(慢2倍):

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

PS。我用这个小提琴进行测试。


查看完整回答
反对 回复 2019-07-24
?
烙印99

TA贡献1829条经验 获得超13个赞

一个高性能解决方案: Array.from({ length: 5 }, () => new Object())


查看完整回答
反对 回复 2019-07-24
  • 3 回答
  • 0 关注
  • 534 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信