सिंबल प्रिमिटिव, एक ऐसी यूनीक वैल्यू दिखाता है जो किसी भी दूसरी वैल्यू से मेल नहीं खाती. इसमें अन्य सिंबल प्रिमिटिव की वैल्यू भी शामिल है. एक जैसे वर्णों से बनी दो स्ट्रिंग प्राइमिटिव का आकलन, एक जैसा किया जाता है:
String() === String()
> true
String( "My string." ) === String( "My string." );
> true
हालांकि, Symbol()
फ़ंक्शन का इस्तेमाल करके बनाए गए कोई भी दो सिंबल, एक जैसे नहीं हो सकते:
Symbol() === Symbol()
> false
इस विशेषता की मदद से, किसी ऑब्जेक्ट में प्रॉपर्टी की यूनीक कुंजियों के तौर पर सिंबल का इस्तेमाल किया जा सकता है. इससे, उस ऑब्जेक्ट में किसी दूसरे कोड से जोड़ी गई कुंजियों के साथ, सिंबल के मेल खाने से रोका जा सकता है.
const mySymbol = Symbol( "Desc" );
const myObject = {};
myObject[mySymbol] = "propSymbol";
myObject
> Object { Symbol("Desc"): "propSymbol" }
सिंबल तीन तरह के होते हैं:
Symbol()
ने बनाए गए सिंबल- शेयर किए गए सिंबल, जिन्हें
Symbol.for()
का इस्तेमाल करके ग्लोबल सिंबल रजिस्ट्री से सेट और वापस पाया जाता है - "प्रसिद्ध सिंबल", जिन्हें सिंबल ऑब्जेक्ट पर स्टैटिक प्रॉपर्टी के तौर पर तय किया गया है. इन सिंबल में इंटरनल तरीके होते हैं, जिन्हें गलती से ओवरराइट नहीं किया जा सकता.
Symbol()
, वैकल्पिक आर्ग्युमेंट के तौर पर ब्यौरा (या "सिंबल का नाम") स्वीकार करता है.
ये ब्यौरे, डीबग करने के लिए ऐसे लेबल होते हैं जिन्हें कोई भी पढ़ सकता है. इनसे नतीजे की यूनीकनेस पर कोई असर नहीं पड़ता. Symbol
को कोई भी कॉल करने पर, एक पूरी तरह से यूनीक सिंबल प्रिमिटिव दिखता है. भले ही, कई कॉल की जानकारी एक जैसी हो:
Symbol( "My symbol." ) === Symbol( "My symbol." );
> false
अन्य प्राइमिटिव डेटा टाइप की तरह ही, सिंबल अपने प्रोटोटाइप से तरीके और प्रॉपर्टी इनहेरिट करते हैं. उदाहरण के लिए, बनाए गए सिंबल की इनहेरिट की गई प्रॉपर्टी के तौर पर ब्यौरा ऐक्सेस किया जा सकता है:
let mySymbol = Symbol( "My symbol." );
mySymbol.description
> "My symbol."
हालांकि, new
कीवर्ड का इस्तेमाल करके कोई सिंबल नहीं बनाया जा सकता:
let mySymbol = new Symbol();
> Uncaught TypeError: Symbol is not a constructor
सिंबल की गिनती नहीं की जा सकती. इसका मतलब है कि स्टैंडर्ड तरीकों का इस्तेमाल करके, सिंबल प्रॉपर्टी को दोहराने पर वे उपलब्ध नहीं होतीं. getOwnPropertySymbols()
वाला तरीका, किसी ऑब्जेक्ट की सिंबल प्रॉपर्टी को ऐक्सेस करने की सुविधा देता है.
शेयर किए गए सिंबल
Symbol.for()
तरीका, रनटाइम के दौरान काम करने वाली ग्लोबल सिंबल रजिस्ट्री में, किसी मौजूदा सिंबल को ढूंढने की कोशिश करता है. इसके लिए, वह कुंजी के तौर पर दी गई स्ट्रिंग का इस्तेमाल करता है. अगर कोई सिंबल मिलता है, तो वह मिलता-जुलता सिंबल दिखाता है. अगर कोई सिंबल नहीं मिलता है, तो यह तय की गई कुंजी के साथ एक सिंबल बनाता है और उसे ग्लोबल रजिस्ट्री में जोड़ता है:
let sharedSymbol = Symbol.for( "My key." );
sharedSymbol === Symbol.for( "My key." )
> true
ये कुंजियां, लेखक के बनाए गए Symbol
प्राइमिटिव को असाइन किए गए ब्यौरे के साथ फ़ंक्शनल ओवरलैप नहीं करती हैं. सिंबल रजिस्ट्री में किसी सिंबल को ऐक्सेस करने के लिए,
आपको पहले for()
का इस्तेमाल करके उसे बनाना होगा:
Symbol( "String" ) === Symbol( "String" );
> false
Symbol( "String" ) === Symbol.for( "String" );
> false
Symbol.for( "String" ) === Symbol.for( "String" );
> true
सिंबल रजिस्ट्री से किसी भी सिंबल की कुंजी वापस पाने के लिए, Symbol.keyFor()
का इस्तेमाल करें:
let mySymbol = Symbol.for( "Key." );
Symbol.keyFor( mySymbol ) ;
> "Key."
"अच्छी तरह से पहचाने जाने वाले" सिंबल
आम तौर पर इस्तेमाल होने वाले सिंबल, Symbol
ऑब्जेक्ट की स्टैटिक प्रॉपर्टी होती हैं. इनमें से हर प्रॉपर्टी एक सिंबल होती है. आम तौर पर इस्तेमाल होने वाले सिंबल, JavaScript के पहले से मौजूद तरीकों को ऐक्सेस करने और उनमें बदलाव करने के लिए, यूनीक प्रॉपर्टी कुंजियां उपलब्ध कराते हैं. साथ ही, इनसे कोर व्यवहार को अनजाने में ओवरराइट होने से भी रोका जा सकता है.
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 ()
सिंबल, ES6 की खास सुविधा है. इसलिए, इन सिंबल वैल्यू का इस्तेमाल, "एक्सटेंशन पॉइंट" के तौर पर किया जाता है. इससे डेवलपर, JavaScript के व्यवहार में बदलाव कर सकते हैं. साथ ही, वे पिछली वर्शन के साथ काम करने से जुड़ी समस्याओं से भी बच सकते हैं.
आम तौर पर, सिंबल की जानी-पहचानी वैल्यू को @@
प्रीफ़िक्स के साथ स्टाइल किया जाता है या %
में लपेटा जाता है, ताकि उनकी कुंजियों को उन प्रोटोटाइप से अलग किया जा सके जिनमें बदलाव किया जा सकता है. उदाहरण के लिए, @@match
(या %match%
) का रेफ़रंस, बदले नहीं जा सकने वाले Symbol.match
से है, न कि String.prototype.match
से.
देखें कि आपको क्या समझ आया
क्या कोई सिंबल बनाने के लिए, new
का इस्तेमाल किया जा सकता है?
इनमें से कौनसे विकल्प, `प्रसिद्ध` सिंबल के बारे में बताते हैं?