"Array.prototype.fill()使用对象传递引用而非创建新实例"
P粉682987577
P粉682987577 2023-08-23 09:15:17
0
2
387

我在玩一下,试图实例化一个长度为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函数时声明每个元素都应该创建一个新对象?还是我应该将其转换为循环?

P粉682987577
P粉682987577

全部回复 (2)
P粉878510551

接受的答案很好,在90%的情况下都能工作。

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

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

a = new Array(ARRAY_SIZE); for (var i = 0; i < ARRAY_SIZE; i++) { a[i] = []; } // 或者使用一行代码的替代方案 for (var i = 0, a = []; i < ARRAY_SIZE; a[i++] = []);

我测试了六种替代方案,得到了以下结果:

  • Array.map(),如上所述(比原来慢11倍!):

    a = new Array(ARRAY_SIZE).fill().map(u => { return []; });
  • for循环,最好的选择(最快):

    // 标准的多行方式 a = new Array(ARRAY_SIZE); for (var i = 0; i < ARRAY_SIZE; i++) { a[i] = []; } // 一行语法 for (var i = 0, a = []; i < ARRAY_SIZE; a[i++] = []);
  • forEach(慢6倍):

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

[更新于2020-08-27] Ilias Karim提出了另一种方法

  • Array.from(慢30倍!)- 在性能方面显然更差,尽管语法最好 :(

    a = Array.from({ length: ARRAY_SIZE }, () => []);
  • [..Array(..)](慢5倍!

    a = [...Array(ARRAY_SIZE)].map(_=>([]))
  • Array.push(..),在性能方面排名第二(慢2倍!

    let a = [], total = ARRAY_SIZE; while(total--) a.push([]);

附注:我在这个fiddle上进行了测试。

    P粉461599845

    您可以首先使用任何值(例如undefined)填充数组,然后您就可以使用map

    var arr = new Array(2).fill().map(u => ({}));
    var arr = new Array(2).fill().map(Object);
      最新下载
      更多>
      网站特效
      网站源码
      网站素材
      前端模板
      关于我们 免责声明 Sitemap
      PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!