Javascript memiliki banyak "trik" di sekitar jenis dan jenis konversi jadi saya bertanya-tanya apakah 2 metode ini sama atau jika ada beberapa kasus sudut yang membuatnya berbeda?
sumber
Javascript memiliki banyak "trik" di sekitar jenis dan jenis konversi jadi saya bertanya-tanya apakah 2 metode ini sama atau jika ada beberapa kasus sudut yang membuatnya berbeda?
Keduanya tidak sepenuhnya sama, dan sebenarnya, konstruktor String yang dipanggil sebagai fungsi (contoh pertama Anda), pada akhirnya akan memanggil toString
metode objek yang diteruskan, misalnya:
var o = { toString: function () { return "foo"; } };
String(o); // "foo"
Di sisi lain, jika pengenal merujuk ke null
atau undefined
, Anda tidak dapat menggunakan toString
metode ini, ini akan memberi Anda TypeError
pengecualian :
var value = null;
String(null); // "null"
value.toString(); // TypeError
The String
konstruktor disebut sebagai fungsi akan kira-kira setara dengan:
value + '';
Aturan konversi tipe dari Object- to- Primitive dijelaskan secara rinci pada spesifikasi, [[DefaultValue]]
operasi internal.
Secara singkat diringkas, saat mengonversi dari Object- to- String , langkah-langkah berikut diambil:
toString
metode.
result
adalah primitif , kembali result
, jika tidak lanjutkan ke Langkah 2.valueOf
metode.
result
adalah primitif , kembali result
, jika tidak lanjutkan ke Langkah 3.TypeError
.Dengan aturan di atas, kita dapat membuat contoh semantik yang terlibat:
var o = {
toString: function () { return "foo"; },
valueOf: function () { return "bar"; }
};
String(o); // "foo"
// Make the toString method unavailable:
o.toString = null;
String(o); // "bar"
// Also make the valueOf method unavailable:
o.valueOf = null;
try {
String(o);
} catch (e) {
alert(e); // TypeError
}
Jika Anda ingin mengetahui lebih banyak tentang mekanisme ini, saya akan merekomendasikan untuk melihat ToPrimitive
dan ToString
operasi internal.
Saya juga merekomendasikan membaca artikel ini:
new String(value)
pada nilai apa pun, itu akan selalu mengembalikan objek string.new String({toString: null})
melemparTypeError
.String()
dan+ ''
sekarang memiliki perbedaan yang cukup signifikan.String(Symbol())
akan berjalan, tetapiSymbol() + ''
akan memunculkan kesalahan (dan Symbol () akan melewatkan pelindung palsu, tidak seperti null dan undefined, jadix && (x + '')
sekarang bisa melempar).value.toString()
akan menyebabkan kesalahan jikavalue
nol.String(value)
jangan.Sebagai contoh:
akan gagal karena
value == null
.harus menampilkan pesan bertuliskan "null" (atau serupa), tetapi tidak akan macet.
sumber
String(value)
harus memiliki hasil yang sama sepertivalue.toString()
dalam setiap kasus, kecuali untuk nilai tanpa properti sepertinull
atauundefined
.''+value
akan menghasilkan hasil yang sama.sumber
String () [ panggilan konstruktor ] pada dasarnya memanggil .toString ()
.toString () dan String () dapat dipanggil pada nilai primitif (angka, boolean, string) dan pada dasarnya tidak akan melakukan apa pun yang istimewa:
Tetapi memanggil fungsi-fungsi ini pada objek adalah tempat yang menarik:
jika objek memiliki fungsi .toString () sendiri, itu akan dipanggil kapan pun Anda membutuhkan objek ini untuk diperlakukan sebagai string (secara eksplisit / implisit)
Ngomong-ngomong, jika Anda ingin memperlakukan objek ini sebagai angka, objek ini harus memiliki fungsi .valueOf () yang ditentukan di dalamnya.
bagaimana jika kita hanya mendefinisikan .valueOf () ?
.valueOf () yang didefinisikan di dalam objek akan dipanggil apakah kita ingin menangani objek sebagai string atau sebagai angka
sumber