javascript - penukaran jenis js
伊谢尔伦
伊谢尔伦 2017-05-19 10:12:39
0
5
540
function a () {

}
a.toString = function(){
    console.log(1)
}
a.valueOf = function(){
    console.log(2)
}
a + '1' //2

Mengapa hanya 2 keluaran bukankah 1 dan 2 sepatutnya dikeluarkan?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

membalas semua(5)
我想大声告诉你

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

PHPzhong

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:

console.log(a + '1');
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan