Posting ini adalah tentang Symbol()
, disertakan dengan contoh aktual yang dapat saya temukan / buat dan fakta & definisi yang dapat saya temukan.
TLDR;
Ini Symbol()
adalah tipe data, diperkenalkan dengan rilis ECMAScript 6 (ES6).
Ada dua fakta aneh tentang Simbol.
tipe data pertama dan hanya tipe data dalam JavaScript yang tidak memiliki literal
variabel apa pun, yang didefinisikan dengan Symbol()
, mendapat konten unik, tetapi tidak benar - benar pribadi .
setiap data memiliki simbolnya sendiri , dan untuk data yang sama simbolnya akan sama . Info selengkapnya di paragraf berikut, kalau tidak itu bukan TLRD; :)
Bagaimana cara menginisialisasi simbol?
1. Untuk mendapatkan pengidentifikasi unik dengan nilai yang dapat diperdebatkan
Anda dapat melakukannya dengan cara ini:
var mySymbol1 = Symbol();
Atau dengan cara ini:
var mySymbol2 = Symbol("some text here");
The "some text here"
String tidak dapat diekstraksi dari simbol, itu hanya keterangan untuk keperluan debugging. Itu tidak mengubah perilaku simbol dengan cara apa pun. Meskipun, Anda bisa console.log
melakukannya (yang adil, karena nilainya untuk debugging, agar tidak salah bahwa log dengan beberapa entri log lainnya):
console.log(mySymbol2);
// Symbol(some text here)
2. Untuk mendapatkan simbol untuk beberapa data string
Dalam hal ini nilai simbol sebenarnya diperhitungkan dan dengan cara ini dua simbol mungkin tidak unik.
var a1 = Symbol.for("test");
var a2 = Symbol.for("test");
console.log(a1 == a2); //true!
Sebut saja simbol-simbol itu "simbol tipe kedua". Mereka tidak berpotongan dengan simbol "tipe pertama" (yaitu yang didefinisikan dengan Symbol(data)
) dengan cara apa pun.
Dua paragraf berikutnya hanya menyinggung simbol tipe pertama .
Bagaimana saya mendapat manfaat dari menggunakan Simbol daripada tipe data yang lebih lama?
Pertama mari kita pertimbangkan objek, tipe data standar. Kita dapat mendefinisikan beberapa pasangan nilai kunci di sana dan memiliki akses ke nilai-nilai dengan menentukan kunci.
var persons = {"peter":"pan","jon":"doe"};
console.log(persons.peter);
// pan
Bagaimana jika kita memiliki dua orang dengan nama Peter?
Melakukan ini:
var persons = {"peter":"first", "peter":"pan"};
tidak masuk akal.
Jadi, tampaknya menjadi masalah dua orang yang sama sekali berbeda memiliki nama yang sama. Mari kita simak yang baru Symbol()
. Ini seperti seseorang dalam kehidupan nyata - siapa pun itu unik , tetapi nama mereka bisa sama. Mari kita mendefinisikan dua "orang".
var a = Symbol("peter");
var b = Symbol("peter");
Sekarang kami memiliki dua orang yang berbeda dengan nama yang sama. Apakah orang kita memang berbeda? Mereka; Anda dapat memeriksa ini:
console.log(a == b);
// false
Apa manfaatnya bagi kami?
Kami dapat membuat dua entri di objek Anda untuk orang yang berbeda dan mereka tidak dapat salah dengan cara apa pun.
var firstPerson = Symbol("peter");
var secondPerson = Symbol("peter");
var persons = {[firstPerson]:"first", [secondPerson]:"pan"};
Catatan:
Perlu diperhatikan, bahwa mengencangkan objek dengan JSON.stringify
akan menjatuhkan semua pasangan yang diinisialisasi dengan Simbol sebagai kunci.
Eksekusi Object.keys
tidak akan mengembalikan Symbol()->value
pasangan tersebut.
Menggunakan inisialisasi ini, sangat mustahil untuk keliru entri untuk orang pertama dan kedua. Memanggil console.log
mereka akan dengan benar menampilkan nama kedua mereka.
console.log(persons[a]);
// first
console.log(persons[b]);
// pan
Ketika digunakan dalam objek, bagaimana perbedaannya dibandingkan dengan mendefinisikan properti yang tidak dapat dihitung?
Memang, sudah ada cara untuk mendefinisikan properti untuk disembunyikan dari Object.keys
dan penghitungan. Ini dia:
var anObject = {};
var fruit = "apple";
Object.defineProperty( anObject, fruit, {
enumerable: false,
value: "green"
});
Apa perbedaan yang terjadi di Symbol()
sana? Perbedaannya adalah Anda masih bisa mendapatkan properti yang didefinisikan dengan Object.defineProperty
cara biasa:
console.log(anObject[fruit]); //green
console.log(anObject["apple"]); //green
console.log(anObject.apple); //green
Dan jika didefinisikan dengan Simbol seperti pada paragraf sebelumnya:
fruit = Symbol("apple");
Anda akan memiliki kemampuan untuk menerima nilainya hanya jika mengetahui variabelnya, yaitu
console.log(anObject[fruit]); //green
console.log(anObject["apple"]); //undefined
console.log(anObject.apple); //undefined
Selain itu, mendefinisikan properti lain di bawah kunci "apple"
akan membuat objek menjatuhkan yang lebih lama (dan jika hard-coded, itu bisa menimbulkan kesalahan). Jadi, tidak ada lagi apel! Sangat disayangkan. Mengacu pada paragraf sebelumnya, Simbol itu unik dan mendefinisikan kunci yang Symbol()
akan membuatnya unik.
Ketik konversi dan pemeriksaan
Tidak seperti tipe data lainnya, tidak mungkin untuk mengkonversi Symbol()
ke tipe data lain.
Dimungkinkan untuk "membuat" simbol berdasarkan tipe data primitif dengan menelepon Symbol(data)
.
Dalam hal memeriksa tipe, tidak ada yang berubah.
function isSymbol ( variable ) {
return typeof someSymbol === "symbol";
}
var a_Symbol = Symbol("hey!");
var totally_Not_A_Symbol = "hey";
console.log(isSymbol(a_Symbol)); //true
console.log(isSymbol(totally_Not_A_Symbol)); //false