Rumah  >  Soal Jawab  >  teks badan

"Array.prototype.fill() menggunakan objek untuk menghantar rujukan dan bukannya mencipta kejadian baharu"

<p>Saya sedang bermain-main sedikit, cuba membuat instantiate tatasusunan baharu panjang <kod>x</kod>, di mana semua elemen tatasusunan telah dimulakan kepada nilai <kod>y</kod>: < /p> <pre class="brush:php;toolbar:false;">var arr = new Array(x).fill(y);</pre> <p>Kaedah ini berfungsi dengan baik jika nilai <code>y</code> bukan <strong>objek</strong>. Iaitu, jika <kod>y</kod> <pre class="brush:php;toolbar:false;">var arr = new Array(2).fill({}); arr[0] === arr[1]; //Hasilnya adalah benar; arr[0].test = 'rentetan'; arr[1].test === 'rentetan'; //Hasilnya juga benar;</pre> <p>Adakah terdapat cara untuk mengisytiharkan bahawa objek baharu perlu dibuat untuk setiap elemen apabila menggunakan fungsi isian? Atau patutkah saya menukarnya kepada gelung? </p>
P粉682987577P粉682987577424 hari yang lalu428

membalas semua(2)saya akan balas

  • P粉878510551

    P粉8785105512023-08-24 00:43:53

    Jawapan yang diterima adalah bagus dan berfungsi 90% sepanjang masa.

    Walau bagaimanapun, jika anda membuat aplikasi JS berprestasi tinggi dan anda menggunakan tatasusunan besar/besar, Array.map(..) akan menghasilkan banyak beban dari segi penggunaan memori dan pemproses kerana ia akan mencipta tatasusunan salinan.

    Saya mengesyorkan menggunakan gelung untuk klasik:

    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++] = []);

    Saya menguji enam alternatif dan mendapat keputusan berikut:

    • Array.map(), seperti di atas (11 kali lebih perlahan! ):

      a = new Array(ARRAY_SIZE).fill().map(u => { return []; });
    • untuk gelung, pilihan terbaik (terpantas):

      // 标准的多行方式
       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 kali lebih perlahan):

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

    [Dikemaskini pada 27-08-2020] Ilias Karim mencadangkan kaedah lain

    • Array.from (30x lebih perlahan! ) - jelas lebih teruk dari segi prestasi, walaupun mempunyai sintaks terbaik :(

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

      a = [...Array(ARRAY_SIZE)].map(_=>([]))
    • Array.push(..), menduduki tempat kedua dari segi prestasi (2x lebih perlahan! )

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

    PS: Saya mengujinya pada rebab ini.

    balas
    0
  • P粉461599845

    P粉4615998452023-08-24 00:21:01

    Anda boleh menggunakan mana-mana nilai dahulu (cth undefined)填充数组,然后您就可以使用map:

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

    balas
    0
  • Batalbalas