"Array.prototype.fill() menggunakan objek untuk menghantar rujukan dan bukannya mencipta kejadian baharu"
P粉682987577
2023-08-23 09:15:17
<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>
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:
Saya menguji enam alternatif dan mendapat keputusan berikut:
Array.map(), seperti di atas (11 kali lebih perlahan! ):
untuk gelung, pilihan terbaik (terpantas):
forEach (6 kali lebih perlahan):
[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 :(
[..Array(..)] (5 kali lebih perlahan! )
Array.push(..), menduduki tempat kedua dari segi prestasi (2x lebih perlahan! )
PS: Saya mengujinya pada rebab ini.
Anda boleh menggunakan mana-mana nilai dahulu (cth
undefined
)填充数组,然后您就可以使用map
: