ES6 में प्रतीक लाने के लिए प्रेरणा क्या है?


368

अद्यतन : हाल ही में मोज़िला का एक शानदार लेख आया। यदि आप उत्सुक हैं तो इसे पढ़ें।

जैसा कि आप जानते हैं कि वे ECMAScript 6 में नए प्रतीक आदिम प्रकार को शामिल करने की योजना बना रहे हैं (कुछ अन्य पागल सामान का उल्लेख नहीं करने के लिए)। मैंने हमेशा सोचा था कि :symbolरूबी में धारणा बेकार है; हम आसानी से इसके बजाय सादे तार का उपयोग कर सकते हैं, जैसे हम जावास्क्रिप्ट में करते हैं। और अब वे जेएस के साथ चीजों को जटिल बनाने का फैसला करते हैं।

मैं प्रेरणा नहीं समझता। क्या कोई मुझे समझा सकता है कि क्या हमें वास्तव में जावास्क्रिप्ट में प्रतीकों की आवश्यकता है?


6
मुझे नहीं पता कि यह स्पष्टीकरण कितना प्रामाणिक है, लेकिन यह एक शुरुआत है: tc39wiki.calculist.org/es6/symbols
फेलिक्स क्लिंग

8
प्रतीक इतना सक्षम करते हैं , वे वस्तुओं पर अद्वितीय पहचानकर्ताओं को छोड़ देते हैं। उदाहरण के लिए, उन वस्तुओं पर गुण होना जो केवल एक ही स्थान पर सुलभ हैं।
बेंजामिन ग्रुएनबाम

5
यकीन है कि के बारे में ऐसा नहीं है कि जब से तुम Object.getOwnPropertySymbols (ओ) का उपयोग कर सकते
Yanis

4
यह गोपनीयता के बजाय अधिक विशिष्टता है।
कंतस 94 हेवी

2
वे एक अधिक जटिल वर्ग कार्यान्वयन के साथ जा रहे थे privateऔर publicकक्षा विशेषता कीवर्ड जो उन्होंने एक सरल वर्ग कार्यान्वयन के लिए खाई का फैसला किया था। के बजाय this.x = xआप करने के लिए public x = xऔर निजी चर के लिए चाहिए थे private y = y। उन्होंने तय किया कि बहुत अधिक न्यूनतम वर्ग कार्यान्वयन के लिए। तब न्यूनतम कार्यान्वयन में निजी गुण प्राप्त करने के लिए प्रतीक एक आवश्यक समाधान होगा।
lyschoening

जवाबों:


224

जावास्क्रिप्ट के लिए प्रतीकों को पेश करने की मूल प्रेरणा निजी गुणों को सक्षम करना था ।

दुर्भाग्य से, वे गंभीर रूप से अपग्रेड किए गए समाप्त हो गए। वे अब निजी नहीं हैं, क्योंकि आप उन्हें प्रतिबिंब के माध्यम से पा सकते हैं, उदाहरण के लिए, Object.getOwnPropertySymbolsप्रॉक्सिस का उपयोग करके ।

वे अब अद्वितीय प्रतीकों के रूप में जाने जाते हैं और उनका एकमात्र उद्देश्य संपत्तियों के बीच नाम के टकराव से बचना है। उदाहरण के लिए, ECMAScript अब कुछ विधियों के माध्यम से एक्सटेंशन हुक शुरू कर सकता है, जिन्हें आप उपयोगकर्ता नामों के साथ टकराव के लिए उन्हें जोखिम में डाले बिना वस्तुओं (जैसे उनके पुनरावृत्ति प्रोटोकॉल को परिभाषित करने के लिए) पर डाल सकते हैं।

क्या यह इतना मजबूत है कि भाषा में प्रतीकों को जोड़ने के लिए प्रेरणा पर्याप्त है।


93
अधिकांश भाषाएं (सभी मुख्यधारा के लोग) कुछ तंत्र प्रदान करते हैं, आमतौर पर प्रतिबिंब, वैसे भी निजी तक पहुंच प्राप्त करने के लिए।
एस्लेइजा

19
@Esailija, मुझे नहीं लगता कि यह सच है - विशेष रूप से, क्योंकि कई भाषाएं पहली जगह में प्रतिबिंब की पेशकश नहीं करती हैं। प्रतिबिंब के माध्यम से निजी स्थिति को लीक करना (जैसे जावा में) को बग माना जाना चाहिए, एक विशेषता नहीं। यह वेब पृष्ठों पर विशेष रूप से सच है, जहां विश्वसनीय निजी राज्य सुरक्षा-प्रासंगिक हो सकते हैं। वर्तमान में, जेएस में इसे प्राप्त करने का एकमात्र तरीका क्लोजर के माध्यम से है, जो थकाऊ और महंगा दोनों हो सकता है।
एंड्रियास रॉसबर्ग

38
तंत्र को प्रतिबिंब नहीं होना है - C ++, Java, C #, Ruby, Python, PHP, Objective-C सभी एक ही मार्ग या किसी अन्य तक पहुंच की अनुमति देते हैं यदि कोई वास्तव में चाहता है। यह वास्तव में क्षमता लेकिन संचार के बारे में नहीं है।
एसाएलिजा

4
वेब पर @plalx, ​​कभी-कभी एनकैप्सुलेशन सुरक्षा के बारे में भी है।
एंड्रियास रॉसबर्ग

3
@ रोलैंडपिल्कास, दुर्भाग्य से, Object.getOwnPropertySymbolsकेवल रिसाव नहीं है; अधिक कठिन एक "निजी" संपत्ति तक पहुंच को बाधित करने के लिए प्रॉक्सी का उपयोग करने की क्षमता है।
एंड्रियास रॉसबर्ग

95

प्रतीक वास्तविक गोपनीयता की गारंटी नहीं देते हैं, लेकिन इसका उपयोग वस्तुओं के सार्वजनिक और आंतरिक गुणों को अलग करने के लिए किया जा सकता है। आइए एक उदाहरण लेते हैं जहां हम Symbolनिजी संपत्तियों के लिए उपयोग कर सकते हैं ।

आइए एक उदाहरण लेते हैं जहां एक वस्तु की संपत्ति निजी नहीं है।

var Pet = (function() {
  function Pet(type) {
    this.type = type;
  }
  Pet.prototype.getType = function() {
    return this.type;
  }
  return Pet;
}());

var a = new Pet('dog');
console.log(a.getType());//Output: dog
a.type = null;
//Modified outside
console.log(a.getType());//Output: null

ऊपर, Petवर्ग संपत्ति typeनिजी नहीं है। इसे निजी बनाने के लिए हमें एक निकटता बनानी होगी। नीचे दिए गए उदाहरण से पता चलता है कि हम कैसे बना सकते हैंtype एक बंद का उपयोग करके निजी ।

var Pet = (function() {
  function Pet(type) {
    this.getType = function(){
      return type;
    };
  }
  return Pet;
}());

var b = new Pet('dog');
console.log(b.getType());//dog
b.type = null;
//Stays private
console.log(b.getType());//dog

उपरोक्त दृष्टिकोण का नुकसान: हम प्रत्येक के लिए एक अतिरिक्त बंद करने की शुरुआत कर रहे हैं Pet निर्मित उदाहरण के , जो प्रदर्शन को नुकसान पहुंचा सकता है।

अब हम परिचय कराते हैं Symbol। यह हमें अतिरिक्त अनावश्यक क्लोजर का उपयोग किए बिना एक संपत्ति को निजी बनाने में मदद कर सकता है। नीचे कोड उदाहरण:

var Pet = (function() {
  var typeSymbol = Symbol('type');
  function Pet(type) {
    this[typeSymbol] = type;
  }
  Pet.prototype.getType = function(){
    return this[typeSymbol];
  }
  return Pet;
}());

var a = new Pet('dog');
console.log(a.getType());//Output: dog
a.type = null;
//Stays private
console.log(a.getType());//Output: dog

15
ध्यान दें कि प्रतीक गुण निजी नहीं हैं ! प्रतीक टकराव मुक्त होते हैं । आप स्वीकृत उत्तर को पढ़ना चाह सकते हैं।
बरगी

3
हां, प्रतीक वास्तविक गोपनीयता की गारंटी नहीं देते हैं लेकिन इसका उपयोग वस्तुओं के सार्वजनिक और आंतरिक गुणों को अलग करने के लिए किया जा सकता है। क्षमा करें, इस बिंदु को मेरे उत्तर में जोड़ना भूल गया। तदनुसार अपना उत्तर अपडेट करूंगा।
समर पंडा

@SamarPanda, आप यह भी कह सकते हैं कि सदस्यों के साथ उपसर्ग _करना सच्ची गोपनीयता की गारंटी नहीं देता है, लेकिन इसका उपयोग वस्तुओं के सार्वजनिक और आंतरिक गुणों को अलग करने के लिए किया जा सकता है। दूसरे शब्दों में, व्यर्थ उत्तर।
पचेरियर

10
मैं निरर्थक नहीं कहूंगा, क्योंकि प्रतीक डिफ़ॉल्ट रूप से असंख्य नहीं हैं, यह भी 'गलती' से नहीं पहुँचा जा सकता है, जबकि कोई अन्य कुंजी कर सकता है।
पैट्रिक

5
मुझे आपका उत्तर केवल वही मिलता है जो वास्तव में एक उदाहरण है जो समझ में आता है, जिस पर आप वस्तु के निजी गुण को केवल एक सामान्य विशेषता के बजाय एक प्रतीक के रूप में परिभाषित करना चाहते हैं।
लुइस लोबो बोरोबिया

42

Symbolsएक नई, विशेष प्रकार की वस्तु है जिसका उपयोग वस्तुओं में एक अद्वितीय संपत्ति के नाम के रूप में किया जा सकता है। के Symbolबजाय का उपयोग कर stringविभिन्न मॉड्यूल संपत्ति है कि एक दूसरे के साथ संघर्ष नहीं बनाने के लिए अनुमति देता है। Symbolsको भी निजी बनाया जा सकता है, ताकि उनकी संपत्तियाँ उन तक न पहुँच सकें, जिनके पास पहले से ही सीधी पहुँच नहीं है Symbol

Symbolsएक नया आदिम है । वैसे ही जैसे number, stringऔर booleanपुरातन, Symbolएक समारोह जो उन्हें बनाने के लिए इस्तेमाल किया जा सकता है। अन्य प्राथमिकताओं के विपरीत, Symbolsएक शाब्दिक सिंटैक्स नहीं है (जैसे कैसे stringहैं '') - उन्हें बनाने का एकमात्र तरीका Symbolनिम्नलिखित तरीके से निर्माणकर्ता के साथ है :

let symbol = Symbol();

वास्तव में, Symbolकिसी वस्तु को गुणों को संलग्न करने के लिए बस थोड़ा सा अलग तरीका है - आप आसानी से अच्छी तरह से Symbolsमानक तरीकों के रूप में ज्ञात कर सकते हैं , जिस तरह Object.prototype.hasOwnPropertyसे सब कुछ दिखाई देता है जो विरासत में मिला है Object

यहाँ Symbolआदिम प्रकार के कुछ लाभ दिए गए हैं ।

Symbols में निर्मित डिबगैबिलिटी है

Symbols एक वर्णन दिया जा सकता है, जो वास्तव में सिर्फ डिबगिंग के लिए उपयोग किया जाता है ताकि उन्हें कंसोल में प्रवेश करते समय जीवन को थोड़ा आसान बनाया जा सके।

SymbolsObjectकुंजी के रूप में इस्तेमाल किया जा सकता है

यह वह जगह है जहाँ Symbolवास्तव में दिलचस्प है। वे भारी वस्तुओं के साथ परस्पर जुड़े हुए हैं। Symbolऑब्जेक्ट के लिए कुंजी के रूप में असाइन किया जा सकता है, जिसका अर्थ है कि आप Symbolकिसी वस्तु को असीमित संख्या में निर्दिष्ट कर सकते हैं और गारंटी दी जा सकती है कि ये stringकुंजी, या अन्य अद्वितीय के साथ कभी भी संघर्ष नहीं करेंगे Symbols

Symbols एक अद्वितीय मूल्य के रूप में इस्तेमाल किया जा सकता है।

चलो मान लेते हैं कि आप एक प्रवेश पुस्तकालय है, जो इस तरह के रूप एकाधिक लॉग स्तरों शामिल है logger.levels.DEBUG, logger.levels.INFO, logger.levels.WARNऔर इतने पर। ES5 कोड में आप ये बनाना चाहते हैं string(तो logger.levels.DEBUG === 'debug'), या numbers ( logger.levels.DEBUG === 10)। ये दोनों आदर्श नहीं हैं क्योंकि ये मूल्य अद्वितीय मूल्य नहीं हैं, लेकिन Symbolये हैं! तो logger.levelsबस हो जाता है:

log.levels = {
  DEBUG: Symbol('debug'),
  INFO: Symbol('info'),
  WARN: Symbol('warn'),
};
log(log.levels.DEBUG, 'debug message');
log(log.levels.INFO, 'info message');

इस महान लेख में और पढ़ें ।


10
मुझे यकीन नहीं है कि मैं आपके उदाहरण को समझता हूं, और आपको इसकी आवश्यकता क्यों है log.levels = {DEBUG: Symbol('debug')और बस नहीं log.levels = {DEBUG:'debug'}। अंत में यह वही है। मुझे लगता है कि यह ध्यान देने योग्य बात है कि किसी ऑब्जेक्ट की कुंजियों पर चलने पर सिंबल अदृश्य होते हैं। यह उनकी "बात" है
vsync

एक लाभ यह है कि कोई गलती से शाब्दिक उपयोग नहीं कर सकता है और विश्वास करता है कि यह हमेशा के लिए काम करेगा। (ध्यान दें कि यह वास्तव में मजबूत तर्क नहीं है, क्योंकि कोई व्यक्ति केवल {}उसी परिणाम के रूप में एक ही परिणाम (जैसे अद्वितीय मूल्य) का उपयोग और प्राप्त कर सकता है, या शायद उस परियोजना में एक शाब्दिक पसंद किया जाता है, या आप कह सकते हैं कि पहले डॉक्टर को पढ़ने की आवश्यकता है।) व्यक्तिगत रूप से लगता है कि यह कोड में अद्वितीय अर्थ की एक अच्छी पठनीयता प्रदान करता है
सेब

ध्यान दें कि जब अद्वितीय मूल्य के रूप में उपयोग किया जाता है, तो ऑब्जेक्ट शाब्दिक में भी डीबगैबिलिटी का निर्माण कियाSymbol("some message") जाता है {message:'some message'}, अर्थात , निश्चित रूप से ऑब्जेक्ट यहां बेहतर करता है क्योंकि आप कई फ़ील्ड जोड़ सकते हैं।
सेब सेब

38

इस पोस्ट के बारे में है Symbol() वास्तविक उदाहरणों के साथ आपूर्ति के , मुझे मिल सकते हैं / बना सकते हैं और मुझे जो तथ्य और परिभाषाएँ मिल सकती हैं।

TLDR;

Symbol()डेटा प्रकार, ECMAScript 6 (ES6) के रिलीज के साथ शुरू की है।

प्रतीक के बारे में दो उत्सुक तथ्य हैं।

  • पहला डेटा प्रकार और केवल डेटा प्रकार जावास्क्रिप्ट में जिसे कोई शाब्दिक नहीं मिला है

  • किसी भी चर, के साथ परिभाषित Symbol(), अद्वितीय सामग्री प्राप्त करता है, लेकिन यह वास्तव में निजी नहीं है ।

  • किसी भी डेटा अपनी है खुद प्रतीक, और एक ही डेटा के लिए प्रतीक होगा ही । निम्नलिखित पैराग्राफ में अधिक जानकारी, अन्यथा यह टीएलआरडी नहीं है; :)

मैं प्रतीक को कैसे आरंभ करूं?

1. डिबग करने योग्य मूल्य के साथ एक विशिष्ट पहचानकर्ता प्राप्त करने के लिए

आप इसे इस तरह से कर सकते हैं:

var mySymbol1 = Symbol();

या इस तरह:

var mySymbol2 = Symbol("some text here");

"some text here"स्ट्रिंग प्रतीक से निकाला नहीं जा सकता है, यह सिर्फ डीबगिंग उद्देश्यों के लिए विवरण दिया गया है। यह किसी भी तरह से प्रतीक के व्यवहार को नहीं बदलता है। हालाँकि, आप console.logइसे कर सकते हैं (जो उचित है, क्योंकि मूल्य डिबगिंग के लिए है, इसलिए यह नहीं कि गलती से कुछ अन्य लॉग प्रविष्टि के साथ लॉग करें):

console.log(mySymbol2);
// Symbol(some text here)

2. कुछ स्ट्रिंग डेटा के लिए एक प्रतीक प्राप्त करने के लिए

इस मामले में प्रतीक के मूल्य को वास्तव में ध्यान में रखा जाता है और इस तरह दो प्रतीक गैर-अद्वितीय हो सकते हैं।

var a1 = Symbol.for("test");
var a2 = Symbol.for("test");
console.log(a1 == a2); //true!

आइए उन प्रतीकों को "दूसरे प्रकार" के प्रतीक कहते हैं। वे "प्रथम-प्रकार" प्रतीकों (यानी जिनके साथ परिभाषित होते हैं) के साथ प्रतिच्छेद नहीं करते हैंSymbol(data) किसी भी तरह ) के ।

अगले दो पैराग्राफ केवल पहले प्रकार से संबंधित हैं प्रतीक से संबंधित हैं।

पुराने डेटा प्रकारों के बजाय प्रतीक का उपयोग करने से मुझे क्या लाभ होगा?

आइए पहले एक ऑब्जेक्ट पर विचार करें, एक मानक डेटा प्रकार। हम वहां कुछ कुंजी-मान जोड़े को परिभाषित कर सकते हैं और कुंजी को निर्दिष्ट करके मूल्यों तक पहुंच बना सकते हैं।

var persons = {"peter":"pan","jon":"doe"};
console.log(persons.peter);
// pan

क्या होगा अगर हमारे पास पीटर नाम के दो व्यक्ति हैं?

यह कर रहा हूं:

var persons = {"peter":"first", "peter":"pan"};

बहुत मतलब नहीं होगा।

तो, एक ही नाम वाले दो बिल्कुल अलग व्यक्तियों की समस्या प्रतीत होती है। चलिए फिर नए का संदर्भ लेते हैं Symbol()। यह वास्तविक जीवन में एक व्यक्ति की तरह है - कोई भी व्यक्ति अद्वितीय है , लेकिन उनके नाम समान हो सकते हैं। चलो दो "व्यक्तियों" को परिभाषित करते हैं।

 var a = Symbol("peter");
 var b = Symbol("peter");

अब हमें एक ही नाम वाले दो अलग-अलग व्यक्ति मिल गए हैं। क्या हमारे व्यक्ति वास्तव में अलग हैं? वो हैं; आप इसे देख सकते हैं:

 console.log(a == b);
 // false

हम वहां कैसे लाभान्वित होंगे?

हम अलग-अलग व्यक्तियों के लिए आपकी ऑब्जेक्ट में दो प्रविष्टियाँ कर सकते हैं और उन्हें किसी भी तरह से गलत नहीं किया जा सकता है।

 var firstPerson = Symbol("peter");
 var secondPerson = Symbol("peter");
 var persons = {[firstPerson]:"first", [secondPerson]:"pan"};

नोट:
यह ध्यान देने योग्य है, हालांकि, ऑब्जेक्ट को कड़े JSON.stringifyकरना एक प्रतीक के रूप में एक कुंजी के साथ आरंभ किए गए सभी जोड़े को छोड़ देगा।
निष्पादन Object.keysऐसे Symbol()->valueजोड़े को वापस नहीं करेगा ।

इस आरंभीकरण का उपयोग करते हुए, पहले और दूसरे व्यक्ति के लिए प्रविष्टियों की गलती करना बिल्कुल असंभव है। console.logउनके लिए कॉल करना सही ढंग से उनके दूसरे नामों को आउटपुट करेगा।

 console.log(persons[a]);
 // first
 console.log(persons[b]);
 // pan

जब वस्तु में उपयोग किया जाता है, तो गैर-संपत्ति को परिभाषित करने की तुलना में यह कैसे अलग है?

वास्तव में, वहाँ पहले से ही एक संपत्ति को परिभाषित करने Object.keysऔर गणना से छिपाए जाने का एक तरीका मौजूद था । यह रहा:

var anObject = {};
var fruit = "apple";    

Object.defineProperty( anObject, fruit, {
    enumerable: false,
    value: "green"
});

Symbol()वहां क्या फर्क पड़ता है ? अंतर यह है कि आप अभी भी Object.definePropertyसामान्य तरीके से परिभाषित संपत्ति प्राप्त कर सकते हैं :

console.log(anObject[fruit]); //green
console.log(anObject["apple"]); //green
console.log(anObject.apple); //green

और अगर पिछले पैराग्राफ में प्रतीक के रूप में परिभाषित किया गया है:

fruit = Symbol("apple");

आपको इसका मूल्य तभी प्राप्त करने की क्षमता होगी, जब इसके चर को जान लिया जाए, अर्थात

console.log(anObject[fruit]); //green
console.log(anObject["apple"]); //undefined
console.log(anObject.apple); //undefined

इसके अलावा, कुंजी के तहत एक और संपत्ति को परिभाषित "apple"करने से ऑब्जेक्ट पुराने को गिरा देगा (और यदि हार्ड-कोडित है, तो यह एक त्रुटि फेंक सकता है)। तो, कोई और अधिक सेब! वह अफसोस की बात है। पिछले पैराग्राफ का जिक्र करते हुए, प्रतीक अद्वितीय हैं और एक कुंजी को परिभाषित करते हुए Symbol()इसे अद्वितीय बना देंगे।

रूपांतरण और जाँच टाइप करें

  • अन्य डेटा प्रकारों के विपरीत, Symbol()किसी अन्य डेटा प्रकार में परिवर्तित करना असंभव है ।

  • कॉल करके आदिम डेटा प्रकार के आधार पर एक प्रतीक "बनाना" संभव है Symbol(data)

  • प्रकार की जाँच के संदर्भ में, कुछ भी नहीं बदलता है।

    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


क्या यह SO प्रलेखन से माइग्रेट किया गया था?
नं।

1
@KNU यह नहीं था; मैंने जानकारी एकत्र की है और इस उत्तर को स्वयं लिखा है
nicael

वाकई खूबसूरत जवाब!
मिहाई अलेक्जेंड्रू-आयनुत

1
प्रतीक पर महान जवाब, हालांकि मुझे अभी भी नहीं पता कि मैं सरणी के बजाय प्रतीक कुंजियों के साथ ऑब्जेक्ट का उपयोग क्यों करूंगा। अगर मेरे पास {"पीटर": "पैन"} {"जॉन": "डू" "} जैसे कई व्यक्ति हैं, तो उन्हें एक वस्तु में रखना मेरे लिए बुरा लगता है। उसी कारण से जैसे कि मैं डुप्लिकेटेड गुणों जैसे personFirstName1, personFirstName2 के साथ कक्षाएं नहीं बनाता। यह असमर्थता के साथ संयुक्त यह मैं सिर्फ नुकसान लाभ नहीं देख रहा हूँ।
eldo

18

यहाँ मैं इसे कैसे देख रहा हूँ। कुछ लोकप्रिय तरीकों जैसे कि Object.keys () और JSON.stringify () के माध्यम से किसी वस्तु की कुंजियों / गुणों को उजागर करने से रोककर, प्रतीक 'गोपनीयता का एक अतिरिक्त स्तर' प्रदान करते हैं।

var age = Symbol();  // declared in another module perhaps?
class Person {
   constructor(n,a){
      this.name = n;
      this[age] = a;  
   }
   introduce(){
       console.log(`My name is ${this.name}. I am ${this[age]-10}.`);
   }
}
var j = new Person('Jane',45);
j.introduce();  // My name is Jane. I am 35.
console.log(JSON.stringify(j)); // {"name":"Jane"}
console.log(Object.keys(j)); // ["name"]
console.log(j[age]); // 45   (well…only if you know the age in the first place…)

हालांकि प्रति ऑब्जेक्ट को देखते हुए, इस तरह के गुणों को अभी भी प्रतिबिंब, प्रॉक्सी, Object.getOwnPropertySymbols () आदि के माध्यम से उजागर किया जा सकता है, लेकिन कुछ प्रत्यक्ष तरीकों के माध्यम से उन तक पहुंचने का कोई प्राकृतिक साधन नहीं है, जो कभी-कभी OOP के नजरिए से पर्याप्त हो सकता है।


2

जेएस प्रतीक एक नया आदिम डेटा प्रकार है। वे टोकन हैं जो अद्वितीय आईडी के रूप में काम करते हैंSymbolकंस्ट्रक्टर का उपयोग करके एक प्रतीक बनाया जा सकता है । उदाहरण के लिए इस स्निपेट को MDN से लें:

// The symbol constructor takes one optional argument, 
// the descriptions which is used for debugging only.
// Here are two symbols with the same description
let Sym1 = Symbol("Sym");
let Sym2 = Symbol("Sym");
  
console.log(Sym1 == Sym2); // returns "false"
// Symbols are guaranteed to be unique.
// Even if we create many symbols with the same description,
// they are different values.

उदाहरण के लिए, अद्वितीय ऑब्जेक्ट गुण कुंजियों के रूप में प्रतीकों का उपयोग करना अक्सर आसान होता है:

let obj = {};
let prop = Symbol();

obj[prop] = 123;  // the symbol prop is assigned 123
obj.prop  = 456;  // the string prop is assigned 456

console.log(obj.prop, obj[prop]); // logs 456, 123


0

प्रतीकों के दो मुख्य उपयोग मामले हैं:

  1. "हिडन" ऑब्जेक्ट गुण। यदि हम किसी ऐसी संपत्ति को किसी अन्य स्क्रिप्ट या लाइब्रेरी में "जोड़ना" चाहते हैं, तो हम एक प्रतीक बना सकते हैं और इसे एक संपत्ति कुंजी के रूप में उपयोग कर सकते हैं। एक प्रतीकात्मक संपत्ति में प्रकट नहीं होता हैfor..in , इसलिए यह गलती से अन्य गुणों के साथ एक साथ संसाधित नहीं किया जाएगा। इसके अलावा इसे सीधे एक्सेस नहीं किया जाएगा, क्योंकि किसी अन्य स्क्रिप्ट में हमारा प्रतीक नहीं है। इसलिए संपत्ति को आकस्मिक उपयोग या अधिलेखित होने से बचाया जाएगा।

    इसलिए हम "गुप्त रूप से" उन वस्तुओं में कुछ छिपा सकते हैं जिनकी हमें ज़रूरत है, लेकिन दूसरों को प्रतीकात्मक गुणों का उपयोग करके नहीं देखना चाहिए।

  2. जावास्क्रिप्ट द्वारा उपयोग किए जाने वाले कई सिस्टम सिंबल हैं जो इस प्रकार सुलभ हैं Symbol.*। हम कुछ अंतर्निहित व्यवहारों को बदलने के लिए उनका उपयोग कर सकते हैं। उदाहरण के लिए, ...... Symbol.iteratorपुनरावृत्तियों के लिए, Symbol.toPrimitiveवस्तु-से-आदिम रूपांतरण और इतने पर सेटअप करने के लिए।

स्रोत

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.