चिह्न

सिंबल, ES6 में शुरू किए गए काफ़ी हद तक नए हैं. प्रिमिटिव सिंबल एक ऐसी यूनीक वैल्यू को दिखाता है जो कभी भी किसी अन्य वैल्यू के साथ नहीं मैच करती. इसमें, अन्य सिंबल प्रिमिटिव की वैल्यू भी शामिल हैं. एक जैसे वर्णों से बने दो स्ट्रिंग प्रिमिटिव को पूरी तरह से बराबर के तौर पर आकलन किया जाता है:

String() === String()
> true

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

हालांकि, Symbol() फ़ंक्शन का इस्तेमाल करके बनाए गए दो सिंबल पूरी तरह से बराबर नहीं हो सकते:

Symbol() === Symbol()
> false

इस trait की मदद से, किसी ऑब्जेक्ट में सिंबल को यूनीक प्रॉपर्टी की के तौर पर इस्तेमाल किया जा सकता है. इससे, उस ऑब्जेक्ट में मौजूद किसी अन्य कोड की वजह से होने वाले टकराव को रोका जा सकता है.

const mySymbol = Symbol( "Desc" );

const myObject = {

}

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 का इस्तेमाल किया जा सकता है?

नहीं
हां

इनमें से कौनसा विकल्प `लोकप्रिय` सिंबल के बारे में बताता है?

`सिंबल` ऑब्जेक्ट की स्टैटिक प्रॉपर्टी
अक्सर इस्तेमाल किए जाने वाले सिंबल
JavaScript के पहले से मौजूद तरीकों को ऐक्सेस करने और उनमें बदलाव करने के लिए यूनीक प्रॉपर्टी कुंजियां