"Array.prototype.fill()使用物件傳遞參考而非建立新實例"
P粉682987577
P粉682987577 2023-08-23 09:15:17
0
2
381

我在玩一下,試圖實例化一個長度為x的新數組,其中該數組的所有元素都初始化為值y:< /p>

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學習者快速成長!