इस पोस्ट के बारे में है 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