Ceramah "Wat" untuk CodeMash 2012 telah mendedahkan beberapa gelagat yang membingungkan dalam JavaScript. Di sini, kami menyelidiki mekanisme asas dan menerangkan hasil yang diperhatikan dalam contoh JSFiddle.
[] + [] result: ""
Rentetan kosong yang terhasil daripada menyertai tatasusunan menyerlahkan bahawa operator menukar kedua-dua operan kepada primitif, memanggil keString() pada tatasusunan. Untuk tatasusunan kosong, penukaran ini menghasilkan rentetan kosong.
[] + {} result: [Object]
Seperti sebelum ini, menukar tatasusunan kosong kepada primitif memberikan kita rentetan kosong. Walau bagaimanapun, objek dipaksa menjadi rentetan menggunakan kaedah toString()nya, menghasilkan "[Objek]." Rentetan ini digabungkan dengan rentetan kosong, menghasilkan "[Objek]."
{} + [] result: [Object]
{} di sini ditafsirkan sebagai blok kosong, menghasilkan primitif kosong nilai. Operator kemudian cuba menukar objek kepada rentetan melalui toString(), yang membawa kepada "[Objek]." Walau bagaimanapun, tingkah laku ini adalah anomali, kerana video mencadangkan hasilnya hendaklah 0.
{} + {} result: [Object][Object]
Sama seperti kes sebelumnya, objek dipaksa menjadi rentetan. Walau bagaimanapun, oleh kerana tiada operator unary, hasilnya tidak ditukar kepada nombor. Sebaliknya, gabungan "[Objek]" dan "[Objek]" dikembalikan.
result: NaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaNNaN
Menolak nombor daripada rentetan menghasilkan NaN. Apabila diluluskan sebagai hujah kepada Array.join, penukaran kepada rentetan (melalui toString()) menghasilkan "NaN." Kaedah join() tatasusunan kemudiannya berulang kali menggabungkan rentetan ini, membawa kepada hasil yang diperhatikan.
Tingkah laku pelik ini berpunca daripada peraturan khusus untuk menukar nilai kepada primitif dan gelagat pengendali dalam JavaScript. Walaupun sesetengah daripada mereka mungkin kelihatan berlawanan dengan intuisi, memahami mekanisme asas membolehkan pembangun menjangka dan mengendalikan kebiasaan ini dengan lebih baik dalam kod mereka sendiri.
Atas ialah kandungan terperinci Mengapa JavaScript Menghasilkan Keputusan Yang Tidak Dijangka Apabila Menambah Tatasusunan dan Objek?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!