Tipe Symbol
adalah tipe khusus dalam JavaScript
. Khususnya, semua nilai tipe Symbol
berbeda satu sama lain. Kita dapat menggunakan "Simbol" untuk mewakili nilai unik. Berikut ini adalah contoh pembuatan objek Symbol
:
let id = Symbol();
Dengan cara ini, kita membuat nilai tipe Symbol
dan menyimpan nilai ini dalam variabel id
.
Saat kita membuat variabel tipe Symbol
, kita dapat meneruskan beberapa string dengan atribut detik di parameternya untuk menjelaskan informasi tujuan variabel ini.
Contoh:
let id1 = Symbol('Id Xiao Ming yang gila dan keren'); let id2 = Simbol('Id Tingting yang sederhana, mewah, dan konotatif');
Jenis Symbol
berbeda-beda setiap saat, meskipun informasi deskripsinya sama, deskripsi tersebut hanyalah label dan tidak memiliki tujuan lain Misalnya:
let id1 = Simbol('id'); misalkan id2 = Simbol('id'); console.log(id1==id2);//
Arti dari label palsu, menurut saya pribadi, ini terkait dengan fakta bahwa Symbol
tidak dapat secara intuitif melihat nilai spesifik internal. Dengan menambahkan informasi deskripsi, kita dapat memiliki nilai yang lebih intuitif pemahaman tentang penggunaan variabel.
Sebagian 123
tipe dalam JavaScript
dapat langsung dikonversi ke tipe string untuk keluaran, jadi kita tidak dapat melihat secara alert(123)
berapa nilainya Konversikan ke popup string.
Namun tipe Symbol
khusus dan tidak dapat dikonversi secara langsung, misalnya:
let id = Simbol(); alert(id);//Laporan kesalahan, tipe Simbol tidak dapat dikonversi
ke string. Tipe Symbol
di JavaScript
tidak dapat dikonversi ke string karena mekanisme "perlindungan bahasa" yang melekat untuk mencegah kebingungan bahasa, karena string dan Symbol
adalah pada dasarnya berbeda Ada perbedaan dan yang satu tidak boleh diubah menjadi yang lain.
Bayangkan saja, jika Symbol
dapat diubah menjadi string, maka itu menjadi fungsi yang menghasilkan string unik, dan tidak diperlukan tipe data independen.
Jika kita memang ingin mengetahui nilai dari variabel Symbol
, kita dapat menggunakan metode .toString()
sebagai berikut:
let id = Simbol('ini adalah identifikasi'); console.log(id.toString());//Symbol(ini adalah identifikasi);
Atau gunakan atribut .description
untuk mendapatkan informasi deskripsi:
let id = Symbol('Ayo, beri aku Oli'); console.log(id.description);//Ayo, Ollie”
Menurut spesifikasi JavaScript
, hanya dua jenis nilai yang dapat digunakan sebagai kunci properti objek:
Jika tipe lain digunakan, Ini akan dikonversi ke tipe string secara implisit. Kunci objek diperkenalkan secara rinci di bab sebelumnya dan tidak akan diulangi di sini.
Ada dua Symbol
Contoh 1:
misalkan id = Simbol('id'); biarkan pengguna = {}; user[id] = 'nilai id';//Tambahkan kunci Simbol console.log(pengguna[id]);//nilai id
Contoh 2:
let id = Simbol('id'); biarkan pengguna = { [id]:'id value',//perhatikan tanda kurung siku di sini }; console.log(user[id]);
Dua kasus di atas menunjukkan penggunaan penyisipan tipe Symbol
sebagai kunci dalam objek. Perlu dicatat bahwa saat mengakses atribut, Anda perlu menggunakan obj[id]
alih-alih obj.id
, karena obj.id
mewakili obj['id']
.
Apa yang akan terjadi jika kita menggunakan Symbol
sebagai kunci objeknya?
Symbol
for...in adalah jika objek menggunakan Symbol
sebagai kunci, maka properti tipe Symbol
tidak dapat diakses menggunakan pernyataan for…in
.
Misalnya:
misalkan id = Simbol('id'); biarkan pengguna = { nama: 'xiaoming', [ya', }; for (let key in user) console.log(user[key]);
Jalankan kode di atas dan dapatkan hasil berikut:
> Xiaoming
dapat menemukan bahwa nilai objek [id]
tidak dicetak, yang menunjukkan bahwa di dalam objek daftar atribut, gunakan for … in
akan secara otomatis mengabaikan kunci bertipe Symbol
.
Demikian pula, Object.keys(user)
akan mengabaikan semua kunci bertipe Symbol
.
Fitur ini dapat memberikan efek yang sangat berguna, misalnya kita dapat membuat properti yang hanya dapat kita gunakan saja.
Meskipun kita tidak mempunyai cara untuk mendapatkan kunci Symbol
secara langsung, metode Object.assign
dapat menyalin semua properti:
let id = Symbol(); misalkan obj = { [id] : '123' } biarkan obj2 = Objek.assign({},obj); console.log(obj2[id]);
Ini tidak mempengaruhi properti tersembunyi dari Symbol
, karena objek yang disalin masih tidak dapat memperoleh kunci Symbol
.
Karena Symbol
tidak dapat langsung dikonversi ke string, kita tidak memiliki cara untuk mendapatkan nilainya secara intuitif, dan kita juga tidak dapat memperoleh atribut Symbol
dari objek melalui for … in
Dengan kata lain, tanpa variabel Symbol
itu sendiri, kita tidak punya cara untuk mendapatkan properti yang sesuai di dalam objek.
Oleh karena itu, melalui nilai kunci bertipe Symbol
, kita dapat menyembunyikan properti tersebut. Properti ini hanya dapat diakses oleh diri kita sendiri, dan tidak ada orang lain yang dapat melihat properti kita.
Misalnya:
Selama proses pengembangan, kami perlu bekerja sama dengan rekan kami "Zhang San", dan Zhang San ini menciptakan Tool
yang sangat mudah digunakan. Tool
adalah tipe objek. Kami ingin menggunakan Tool
Zhang San secara gratis , dan Tambahkan beberapa properti Anda sendiri berdasarkan ini.
Kita dapat menambahkan kunci tipe Symbol
:
let tool = {//Tool yang ditulis oleh Zhang San penggunaan: "Bisa melakukan apa saja", } biarkan nama = Simbol("Alat saya obj"); alat[nama] = "Ini alat saya"; console.log(tool[name]);
Contoh di atas menunjukkan cara menambahkan properti Anda sendiri ke objek yang ditulis oleh orang lain, jadi mengapa menggunakan tipe Symbol
alih-alih string biasa?
Alasannya sebagai berikut:
tool
objek adalah kode yang ditulis oleh orang lain. Prinsipnya, kita tidak boleh mengubah kode orang lain, karena akan menimbulkan risiko;Symbol
, karena Symbol
berbeda;Symbol
, yang berarti tidak akan bertentangan dengan kode kesalahan orang lain;
Jika kita tidak menggunakan tipe Symbol
, kemungkinan akan terjadi situasi berikut:
let tool = {//Tool ditulis oleh Zhang San penggunaan: "Bisa melakukan apa saja", } alat.penggunaan = "Boom Boom"; console.log(tool.usage);
Kode di atas menggunakan kembali "penggunaan" dan dengan demikian menulis ulang atribut asli, yang akan menyebabkan fungsi asli objek menjadi tidak normal.
Semua variabel Symbol
berbeda, meskipun memiliki label (deskripsi) yang sama.
Terkadang kita ingin mengakses objek Symbol
yang sama melalui nama string (label), misalnya kita mengakses Symbol
yang sama di tempat berbeda dalam kode.
JavaScript
mengelola registri Symbol
global. Kita dapat mengakses objek dengan memasukkan objek Symbol
ke dalam registri dan memberi nama string pada objek tersebut.
Untuk menyisipkan atau membaca objek Symbol
ke dalam registri, Anda perlu menggunakan metode Symbol.for(key)
. Jika ada objek bernama key
di registri, objek tersebut akan dikembalikan kembali.
Misal:
let id1 = Symbol.for('id');//Tidak ada Simbol bernama id di registry, buat dan kembalikan let id2 = Symbol.for('id');//Sudah ada Simbol bernama id di registri Untuk Simbol dengan id, langsung kembalikan console.log(id1===id2);//true.
Melalui Symbol.for(key)
kita dapat menggunakan objek Symbol
sebagai variabel global dan menggunakan string untuk tandai nama objeknya.
Sebaliknya, kita juga bisa menggunakan Symbol.keyFor(Symbol)
untuk mendapatkan nama dari objek secara terbalik.
Misalnya:
let id = Symbol.for('id');//Tidak ada Simbol bernama id di registri, buat dan kembalikan let name = Symbol.keyFor(id); console.log(name);//id
Fungsi Symbol.keyFor()
hanya dapat digunakan pada undefined
Symbol
global (objek yang disisipkan menggunakan Symbol.for
).
Misalnya:
misalkan id = Simbol('id');//Simbol lokal biarkan nama = Simbol.keyFor(id); console.log(name);//
JavaScript
memiliki banyak Symbol
sistem, seperti:
Symbol.hasInstance
Symbol.iterator
Symbol.toPrimitive
.
Symbol
unik;Symbol
dapat menambahkan label dan menanyakan entitas objek dalam registri global melalui label;Symbol
sebagai kunci objek tidak dapat dideteksi for … in
Symbol
Objek Symbol
global;namun, Symbol
tidak sepenuhnya tersembunyi. Kita bisa mendapatkan semua Symbol
objek melalui Object.getOwnPropertySymbols(obj)
, atau mendapatkan semua kunci objek melalui Reflect.ownKeys(obj)
.