Artikel ini membawa anda pengetahuan tentang penukaran jenis dalam JavaScript Menukar nilai kepada nilai primitif, menukar kepada nombor dan menukar kepada rentetan sepadan dengan tiga operasi abstrak di dalam enjin: ToPrimitive() , ToNumber(), ToString() , saya harap ia akan membantu semua orang.
Peraturan penambahan JavaScript
Dalam JavaScript, peraturan penambahan sebenarnya sangat mudah, terdapat hanya dua Situasi:
Nombor dan nombor ditambah
Rentetan dan rentetan ditambah
Semua yang lain jenis nilai akan ditukar secara automatik kepada dua jenis nilai ini
Dalam JavaScript, terdapat dua jenis nilai:
Nilai asal ialah: tidak ditentukan, null, boolean, nombor, rentetan, simbol
nilai objek: semua nilai lain ialah nilai jenis objek, termasuk tatasusunan (tatasusunan) dan fungsi (tatasusunan)
Penukaran jenis
Pengendali penambahan akan mencetuskan tiga penukaran jenis: Tukar nilai kepada nilai primitif, nombor, dan rentetan, yang sepadan dengan tiga operasi abstrak di dalam enjin JavaScript: ToPrimitive(), ToNumber(), ToString()
Tukar nilai kepada nilai asal melalui ToPrimitive()
ToPrimitive(input, PreferredType?)
Parameter pilihan PreferredType boleh menjadi Number atau String, yang hanya mewakili pilihan penukaran dan hasil penukaran tidak semestinya Ia mestilah jenis yang ditunjukkan oleh parameter ini, tetapi hasil penukaran mestilah nilai primitif Jika PreferredType ditandakan sebagai Nombor, operasi berikut akan dilakukan untuk menukar nilai input (§9.1):
Jika nilai input sudah menjadi nilai primitif, kembalikan terus
Jika tidak, jika nilai input ialah objek, panggil kaedah valueOf() bagi objek tersebut. ) kaedah ialah nilai primitif, kemudian kembalikan nilai primitif ini nilai, kemudian kembalikan nilai primitif. daripada langkah kedua dan ketiga operasi akan diterbalikkan Jika tiada parameter PreferredType, nilai PreferredType akan ditetapkan secara automatik mengikut peraturan berikut: Objek jenis tarikh akan ditetapkan kepada String, dan jenis nilai lain. akan ditetapkan. Tukar nilai kepada Nombor melalui ToNumber() untuk Nombor.
Jika nilai yang dimasukkan ialah Objek akan terlebih dahulu memanggil ToPrimitive(obj, Number) untuk menukar objek menjadi a nilai primitif, dan kemudian panggil ToNumber() untuk menukar nilai primitif kepada nombor
Melalui ToString () Tukar nilai kepada rentetan
Jika nilai input ialah objek, ToPrimitive(obj, String) akan terlebih dahulu dipanggil untuk menukar nilai Objek ditukar kepada nilai primitif, dan kemudian ToString() dipanggil ke tukar nilai primitif kepada rentetan.demo
Nombor Apabila dipanggil sebagai fungsi (bukan sebagai pembina), operasi ToNumber() dipanggil secara dalaman dalam enjin:
Tambahan
Apabila mengira ungkapan ini, langkah-langkah adalah seperti berikut:
Tukar dua operan kepada nilai primitif (berikut ialah tatatanda matematik, bukan kod JavaScript ):
var obj = { valueOf: function () { console.log("valueOf"); return {}; // 没有返回原始值 }, toString: function () { console.log("toString"); return {}; // 没有返回原始值 } }
Number(obj) // output valueOf toString Uncaught TypeError: Cannot convert object to primitive value String(obj) // output toString valueOf Uncaught TypeError: Cannot convert object to primitive value
Jika prim1 Atau jika mana-mana satu daripada prim2 ialah rentetan, tukar yang satu lagi menjadi rentetan, dan kemudian kembalikan hasil daripada dua operasi penggabungan rentetan; Jika tidak, tukar prim1 dan prim2 Kedua-duanya ditukar kepada jenis angka dan jumlahnya dikembalikan.
value1 + value2
prim1 := ToPrimitive(value1) prim2 := ToPrimitive(value2)
[] akan ditukar kepada Untuk nilai primitif, mula-mula cuba kaedah valueOf() dan kembalikan tatasusunan itu sendiri (ini):
{} {}
Output. : NaNEnjin JavaScript mentafsir {} pertama sebagai blok kod kosong dan mengabaikan penambahan
di sini Tandanya bukan operator binari yang mewakili penambahan, tetapi operator unari, yang menukarkan operan yang mengikutinya kepada nombor, betul-betul sama dengan fungsi Number(). Contohnya:
+{} Number({}) Number({}.toString()) // 因为{}.valueOf()不是原始值 Number("[object Object]") NaN
> {} + [] 0
{} 忽略
+[] = Number([]) = Number([].toString()) = Number("") = 0
有趣的是,Node.js的REPL在解析类似的输入时,与Firefox和Chrome(和Node.js一样使用V8引擎)的解析结果不同.下面的输入会被解析成一个表达式,结果更符合我们的预料:
> {} + {} '[object Object][object Object]' > {} + [] '[object Object]'
总结
对象.valueOf() === 对象
数组对象.toString() === 数组对象.join()
对象.toString() === "[object Object]"
Javacript 中 + 号工作:
数字 + 数字
字符串 + 字符串
【相关推荐:javascript学习教程】
Atas ialah kandungan terperinci Penukaran jenis JavaScript (penjelasan terperinci dan contoh). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!