"Array.prototype.fill() menggunakan objek untuk menghantar rujukan dan bukannya mencipta kejadian baharu"
P粉682987577
P粉682987577 2023-08-23 09:15:17
0
2
425
<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粉682987577
P粉682987577

membalas semua(2)
P粉878510551

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.

P粉461599845

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);
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!