Simbol

Simbol adalah simbol yang relatif baru primitif yang diperkenalkan di ES6. Primitif simbol mewakili nilai unik yang tidak pernah bertabrakan dengan nilai lain, termasuk nilai dari primitif simbol lainnya. Dua primitif string yang terdiri dari karakter identik dievaluasi secara ketat sama dengan:

String() === String()
> true

String( "My string." ) === String( "My string." );
> true

Namun, tidak boleh ada dua simbol yang dibuat menggunakan fungsi Symbol() sama persis:

Symbol() === Symbol()
> false

Sifat ini memungkinkan Anda menggunakan simbol sebagai kunci properti unik dalam sebuah objek, mencegah tabrakan dengan kunci yang mungkin ditambahkan kode lain ke objek itu.

const mySymbol = Symbol( "Desc" );

const myObject = {

}

myObject
> Object { Symbol("Desc"): "propSymbol" }

Ada tiga jenis simbol:

  • Simbol yang dibuat dengan Symbol()
  • Simbol bersama yang ditetapkan dan diambil dari registry Simbol global menggunakan Symbol.for()
  • "Simbol yang diketahui" didefinisikan sebagai properti statis pada objek Symbol. Simbol ini berisi metode internal yang tidak dapat ditimpa secara tidak sengaja.

Symbol() menerima deskripsi (atau "nama simbol") sebagai argumen opsional. Deskripsi ini adalah label yang dapat dibaca manusia untuk tujuan proses debug, dan deskripsi tersebut tidak mempengaruhi keunikan hasil. Setiap panggilan ke Symbol akan menampilkan primitif simbol yang benar-benar unik, walaupun beberapa panggilan memiliki deskripsi:

Symbol( "My symbol." ) === Symbol( "My symbol." );
> false

Seperti tipe data primitif lainnya, simbol mewarisi metode dan properti dari prototipe mereka. Misalnya, Anda dapat mengakses deskripsi sebagai properti turunan dari simbol yang dibuat:

let mySymbol = Symbol( "My symbol." );

mySymbol.description
> "My symbol."

Namun, Anda tidak dapat membuat simbol menggunakan kata kunci new:

let mySymbol = new Symbol();

> Uncaught TypeError: Symbol is not a constructor

Simbol tidak dapat dienumerasi, artinya properti simbolis tidak tersedia ketika menggunakan metode standar untuk mengulanginya. getOwnPropertySymbols() yang memberikan akses ke properti simbol objek.

Simbol bersama

Metode Symbol.for() mencoba mencari simbol yang ada di registry simbol global seluruh runtime dengan string tertentu sebagai kunci, dan menampilkan simbol yang sesuai jika ditemukan. Jika tidak menemukannya, sistem akan membuat simbol dengan kunci yang ditentukan dan menambahkannya ke registry global:

let sharedSymbol = Symbol.for( "My key." );

sharedSymbol === Symbol.for( "My key." )
> true

Kunci ini tidak memiliki fungsi yang tumpang-tindih dengan deskripsi yang ditetapkan pada primitif Symbol yang dibuat penulis. Untuk mengakses simbol dalam {i>symbolic registry<i}, Anda harus membuatnya terlebih dahulu menggunakan for():

Symbol( "String" ) === Symbol( "String" );
> false

Symbol( "String" ) === Symbol().for( "String" );
> false

Symbol().for( "String" ) === Symbol().for( "String" );
> true

Untuk mengambil kunci suatu simbol dari registry simbol, gunakan Symbol.keyFor():

let mySymbol = Symbol.for( "Key." );

Symbol.keyFor( mySymbol ) ;
> "Key."

"Terkenal" simbol

Simbol yang dikenal baik adalah properti statis dari objek Symbol, yang masing-masing adalah simbol itu sendiri. Simbol yang dikenal menyediakan kunci properti unik untuk mengakses dan mengubah metode bawaan JavaScript, sekaligus mencegah agar tidak ditimpa secara tidak sengaja.

Symbol;
> function Symbol()
    asyncIterator: Symbol(Symbol.asyncIterator)
    for: function for()
    hasInstance: Symbol("Symbol.hasInstance")
    isConcatSpreadable: Symbol("Symbol.isConcatSpreadable")
    iterator: Symbol(Symbol.iterator)
    keyFor: function keyFor()
    length: 0
    match: Symbol("Symbol.match")
    matchAll: Symbol("Symbol.matchAll")
    name: "Symbol"
    prototype: Object { … }
    replace: Symbol("Symbol.replace")
    search: Symbol("Symbol.search")
    species: Symbol("Symbol.species")
    split: Symbol("Symbol.split")
    toPrimitive: Symbol("Symbol.toPrimitive")
    toStringTag: Symbol("Symbol.toStringTag")
    unscopables: Symbol("Symbol.unscopables")
    <prototype>: function ()

Karena simbol adalah fitur khusus untuk ES6, nilai-nilai simbolis ini dimaksudkan untuk digunakan sebagai "titik perluasan" bagi developer yang mengubah tanpa menimbulkan masalah kompatibilitas mundur.

Nilai-nilai simbol yang terkenal sering bergaya dengan Awalan @@ atau digabungkan dalam % untuk membedakan kuncinya dari prototipe yang dapat berubah. Misalnya, @@match (atau %match%) adalah referensi ke Symbol.match yang tidak dapat diubah, bukan String.prototype.match.

Menguji pemahaman Anda

Dapatkah Anda menggunakan new untuk membuat simbol?

Tidak
Ya

Manakah dari berikut ini yang menggambarkan simbol `baik dikenal`?

Properti statis objek `Symbol`
Simbol yang sering Anda gunakan
Kunci properti unik untuk mengakses dan mengubah JavaScript metode bawaan