Saya tidak membaca buku Rhino baru-baru ini Terjemahan buku itu sangat teruk dan sukar untuk disebut, terutamanya bahagian prototaip yang tidak kemas Kemudian, selepas diperkenalkan oleh rakan sekerja, saya membeli buku tentang pengaturcaraan lanjutan. dan kemudian saya terus membacanya dengan susah payah, mari kita teruskan bercakap tentang jenis pembungkusan segar dalam js.
1: Rentetan
Bercakap tentang jenis Rentetan, ia agak menarik Kami biasanya mentakrifkan jenis rentetan seperti ini, seperti yang ditunjukkan di bawah:
Tetapi terdapat satu perkara yang sangat istimewa dalam js, iaitu jenis rentetan adalah jenis asas dan bukan jenis rujukan, yang bermaksud bahawa nilai rentetan disimpan pada "tindanan", tetapi ini bukan kes dalam banyak bahasa, seperti C#, saya fikir ia boleh difahami bahawa js tidak digunakan sebagai jenis rujukan Lagipun, ia tidak boleh bermain dengan multi-threading, dan ruang tindanan benang dalam C# hanya memperuntukkan 1M jenis nilai dalam C#, terdapat kemungkinan letupan tindanan, dan js tidak mempunyai had ruang tindanan, jadi tiada letupan tindanan.
Kemudian soalan seterusnya datang Kami sering melakukan satu siri operasi pada rentetan, seperti subrentetan. Seperti yang ditunjukkan di bawah:
Seperti yang saya katakan tadi, nilai rentetan disimpan terus pada tindanan, jadi bagaimanakah ia boleh mempunyai subrentetan? Menurut penjelasan di laman web rasmi, ia adalah seperti berikut: Pada masa ini, jenis String akan digunakan untuk membungkus s ke dalam jenis rujukan. Kemudian gunakan pelaksanaan dalaman jenis String Ia berlaku bahawa kaedah subrentetan ditakrifkan secara dalaman dalam String, jadi sebenarnya kod di atas harus dilaksanakan seperti ini di dalam js.
var s=new String("hello") var r=s.substring(3) s="hello"
Seperti yang anda lihat, jenis pembungkusan sebenarnya membungkus s ke dalam jenis rujukan String pada masa kod dilaksanakan, dan kemudian memanggil kaedah subrentetan di bawah jenis rujukan String, dan kemudian menetapkan semula nilai "hello" kepada s, dan akhirnya Kesannya ialah s="hello", r="lo". baca Nilai warna, seperti gambar di bawah:
Jika anda memahami prinsip yang saya nyatakan di atas, maka tidaklah menghairankan bahawa console.log(s.color) adalah sama dengan undefined. Kita dapat melihatnya apabila saya menggunakan s.color="red", Apabila enjin js mendapati bahawa terdapat cara untuk memanggil atribut, ia akan segera membungkusnya secara dinamik ke dalam jenis String di latar belakang, dan kemudian menambah atribut baru color=red di bawah String, dan kemudian secara dalaman menetapkan semula nilai s kepada "hello" ( s "hello"), kemudian apabila anda console.log ke output s.color, enjin js menentukan bahawa terdapat kaedah lain untuk memanggil atribut, dan melakukan String baharu ("hello") semula, di bawah jenis String baharu ini Tiada atribut warna, jadi undefined dikembalikan.
Seperti yang saya katakan tadi, operasi pembungkusan jenis ini ditambah dan dipadamkan secara dinamik oleh js di latar belakang, menukar jenis asas kepada jenis rujukan Jadi apakah perbezaan antara kedua-duanya?
<1>: Tidak perlu dikatakan, ini adalah timbunan dan timbunan Jika anda tahu C# dengan baik, anda boleh menganggapnya sebagai operasi kotak dan nyahkotak.
<2>: Kami tahu bahawa semua jenis rujukan mewarisi daripada objek. Jangan keliru dengan berorientasikan objek Sebagai contoh, dalam C#, semua jenis adalah subkelas objek 🎜>
Itu tidak berlaku di dalam kita boleh menggunakan instanceof untuk melihat.
Dua: Boolean
Jika anda memahami kelas pembalut String, maka sebenarnya kelas pembalut Boolean mempunyai prinsip yang sama dengannya, tetapi terdapat nota apabila menggunakan jenis Boolean Kami tahu bahawa jenis rujukan, melainkan ia adalah batal atau tidak ditentukan, jika tidak, ia akan sentiasa benar, dan jenis Boolean ini melakukan operasi kotak ini dengan tepat, seperti yang ditunjukkan di bawah:Kami melihat bahawa pada masa ini b bukan lagi jenis asas yang mudah, tetapi jenis rujukan Pada masa ini, "dan atau" tidak lagi dapat menghasilkan hasil yang saya inginkan. Terdapat juga kelas pembalut Nombor Tiada langkah berjaga-jaga untuk ini, jadi saya tidak akan menyertainya.