Biar saya lebih spesifik: secara amnya hanya satu daripada dua kaedah, valueOf dan toString, boleh dipanggil Bergantung pada jenis objek, terdapat perintah penghakiman yang berbeza. Khususnya: 1 Jika objek hendak ditukar menjadi rentetan, ia akan mengesan sama ada objek itu mempunyai kaedah toString(), memanggil ini dan mengembalikan nilai asal, kemudian menukar nilai itu menjadi rentetan. Jika objek tidak mempunyai kaedah toString(), atau kaedah ini tidak mengembalikan nilai primitif. Kemudian js akan mengesan sama ada objek mempunyai kaedah valueOf(), memanggilnya jika wujud, juga memanggil dan mengembalikan nilai asal, dan kemudian menukar nilai ini menjadi rentetan. Jika kaedah valueOf mahupun toString objek tidak wujud, pengecualian TypeError akan dilemparkan. 2 Jika objek hendak ditukar kepada nombor, ia akan mengesan sama ada ia mempunyai kaedah valueOf() Jika ia tidak mengesan kaedah toString(), prinsip khusus adalah sama seperti di atas. 3 Untuk semua objek bukan tarikh, penukaran objek kepada nilai asal pada asasnya ialah penukaran objek kepada nombor, dan semua valuesof() dipanggil dahulu objek kepada rentetan digunakan Mod penukaran. Khusus untuk soalan anda, a bukan objek tarikh, jadi kaedah valueof() dipanggil dahulu Selepas penukaran berjaya, kaedah toString() secara semula jadi tidak akan dipanggil lagi.
Apabila menjalankan a+'1', hanya kaedah a.valueOf dipanggil, dan kaedah toString tidak dipanggil Anda boleh memahami mekanisme kaedah toValueOf dan toString
Oleh kerana ini adalah mekanisme penghuraian js, penggunaan "+" anda menunjukkan masalah menggunakan penukaran tersirat Jika anda tidak mempunyai peruntukan khas, js secara automatik akan memanggil kaedah toString seperti penukaran. Jika anda menulis valueOf, ia akan ditukar mengikut valueOf Sudah tentu, toString mempunyai keutamaan yang lebih tinggi
Apabila anda melakukan operasi penambahan, anda hanya akan memanggil valueOf Kerana ia tidak dicetak, tidak perlu menukarnya menjadi rentetan, dan sudah tentu kepadaString tidak akan dicetuskan. Jika anda mencetaknya seperti ini, anda dapat melihat bahawa kedua-dua kaedah akan dipanggil:
Biar saya lebih spesifik: secara amnya hanya satu daripada dua kaedah, valueOf dan toString, boleh dipanggil Bergantung pada jenis objek, terdapat perintah penghakiman yang berbeza. Khususnya:
1 Jika objek hendak ditukar menjadi rentetan, ia akan mengesan sama ada objek itu mempunyai kaedah toString(), memanggil ini dan mengembalikan nilai asal, kemudian menukar nilai itu menjadi rentetan. Jika objek tidak mempunyai kaedah toString(), atau kaedah ini tidak mengembalikan nilai primitif. Kemudian js akan mengesan sama ada objek mempunyai kaedah valueOf(), memanggilnya jika wujud, juga memanggil dan mengembalikan nilai asal, dan kemudian menukar nilai ini menjadi rentetan. Jika kaedah valueOf mahupun toString objek tidak wujud, pengecualian TypeError akan dilemparkan.
2 Jika objek hendak ditukar kepada nombor, ia akan mengesan sama ada ia mempunyai kaedah valueOf() Jika ia tidak mengesan kaedah toString(), prinsip khusus adalah sama seperti di atas.
3 Untuk semua objek bukan tarikh, penukaran objek kepada nilai asal pada asasnya ialah penukaran objek kepada nombor, dan semua valuesof() dipanggil dahulu objek kepada rentetan digunakan Mod penukaran.
Khusus untuk soalan anda, a bukan objek tarikh, jadi kaedah valueof() dipanggil dahulu Selepas penukaran berjaya, kaedah toString() secara semula jadi tidak akan dipanggil lagi.
Apabila menjalankan a+'1', hanya kaedah a.valueOf dipanggil, dan kaedah toString tidak dipanggil Anda boleh memahami mekanisme kaedah toValueOf dan toString
masalah mekanisme penghuraian JS
Oleh kerana ini adalah mekanisme penghuraian js, penggunaan "+" anda menunjukkan masalah menggunakan penukaran tersirat Jika anda tidak mempunyai peruntukan khas, js secara automatik akan memanggil kaedah toString seperti penukaran. Jika anda menulis valueOf, ia akan ditukar mengikut valueOf Sudah tentu, toString mempunyai keutamaan yang lebih tinggi
Apabila anda melakukan operasi penambahan, anda hanya akan memanggil valueOf Kerana ia tidak dicetak, tidak perlu menukarnya menjadi rentetan, dan sudah tentu kepadaString tidak akan dicetuskan.
Jika anda mencetaknya seperti ini, anda dapat melihat bahawa kedua-dua kaedah akan dipanggil: