2015-11-22 14 views
15

मैं सी # से लिस्प तक स्कैला से हास्केल तक सब कुछ के साथ काम करने के दौरान ब्लॉक के आसपास रहा हूं, और उन सभी भाषाओं में जो उनके समर्थन में हैं, प्रतीकों ने काफी कुछ किया है; यानी, एक ही नाम वाले किसी भी दो प्रतीकों को समान होने की गारंटी है क्योंकि वे सिंगलटन ऑब्जेक्ट्स हैं।ईएस 6 सिंबल को समझना

रैकेट: (equal? 'foo 'foo) सच

कॉमन लिस्प: (eq 'foo 'foo) सच

रूबी: :foo == :foo सच

स्काला: 'foo == 'foo सच

ES6: Symbol('foo') === Symbol('foo')झूठी

सिंगलेट्स होने वाले प्रतीकों का लाभ स्पष्ट है: आप उन्हें अपने इनपुट के बराबर नहीं होने के कारण अपने कुंजी को जोखिम के बिना मानचित्र/शब्दकोशों में उपयोग कर सकते हैं क्योंकि भाषा ने अचानक इसे अलग करने का फैसला किया है (रूबी आपको देख रहा है)

तो क्यों है यह कि ईसीएमएस्क्रिप्ट 6 इस पर एक अलग दृष्टिकोण लेता है, और मैं इसके आसपास कैसे हो सकता हूं?

उत्तर

14

आप कर सकते हैं (तरह-के) पंजीकृत (वैश्विक) प्रतीकों का उपयोग करके नाम से किया जा रहा है "ज्ञेय" प्रतीकों में से प्रभाव प्राप्त: एक साथ,

var s1 = Symbol.for("foo"); 
var s2 = Symbol.for("foo"); 
s1 === s2; // true 

बेशक आप अपने खुद के प्रतीक रजिस्ट्री भी बना सकते हैं नक्शा उदाहरण या एक सादा वस्तु।

संपादित — मैं जोड़ देंगे कि वैकल्पिक स्ट्रिंग पैरामीटर के इरादे जब एक नया प्रतीक उदाहरण बनाने प्रोग्रामर को अर्थ और प्रतीक के प्रयोजन के पहचानने के किसी तरीके प्रदान करना है। उस स्ट्रिंग के बिना, एक प्रतीक एक प्रतीक के रूप में ठीक काम करता है, लेकिन यदि आप किसी ऑब्जेक्ट को डीबगर में डंप करते हैं तो ऐसे अज्ञात प्रतीक उदाहरणों द्वारा की गई गुण केवल मान हैं। यदि आप प्रतीक कुंजी के साथ किसी ऑब्जेक्ट पर संख्यात्मक गुण रखते हैं, तो आप केवल कुछ संख्याएं देखेंगे, और यह भ्रमित हो जाएगा। एक प्रतीक उदाहरण से जुड़े वर्णन स्ट्रिंग प्रोग्रामर संदर्भ जानकारी को प्रतीक की विशिष्टता के साथ एक महत्वपूर्ण मूल्य के रूप में समझौता किए बिना देता है।

अंत में, आप दो समान रूप से निर्मित प्रतीक उदाहरणों पर .toString() पर कॉल करने के परिणाम की तुलना कर सकते हैं। मैं संदिग्ध कि उस अभ्यास को संदिग्ध माना जाएगा, लेकिन आप निश्चित रूप से यह कर सकते हैं।

संपादित अधिक — यह मेरे लिए होता है कि तथ्य यह है कि डिफ़ॉल्ट जावास्क्रिप्ट में प्रतीक सृजन के व्यवहार प्रकार अधिक उपयोगी जो एक राशि में आता है, Clojure में Erlang में परमाणुओं या कुंजी। चूंकि भाषा डिफ़ॉल्ट रूप से एक मूल्य प्रदान करती है जो अनूठी होने की गारंटी देती है, नामस्थान टकराव की मौलिक समस्या बहुत अच्छी तरह हल हो जाती है। "जाने-माने" प्रतीकों के साथ काम करना अभी भी संभव है, लेकिन अन्य कोडों के साथ विवादों के बारे में चिंता किए बिना अद्वितीय मूल्य उपलब्ध हैं जो टकराव से बचने के लिए भी अच्छा हो सकता है। जावास्क्रिप्ट में कुछ हद तक अद्वितीय, और निश्चित रूप से विशिष्ट व्यापक और अनियंत्रित, वैश्विक नामस्थान की समस्या है जिसे कोड द्वारा प्रदूषित किया जा सकता है जिसे प्रोग्रामर को भी पता नहीं है, क्योंकि कोड किसी पार्टी के कार्यों के कारण ब्राउज़र वातावरण में टकरा सकता है , और सॉफ्टवेयर आर्किटेक्ट्स की एक मनमानी संख्या के लिए अज्ञात है।

+1

क्यों 'सॉर्ट-ऑफ' - ' –

+0

@ जारोमांडाएक्स' के लिए एक अच्छा तरीका लगता है, ठीक है, वे किसी भी तरह से स्कॉप्ड नहीं हैं, लेकिन मुझे लगता है कि किसी भी अन्य भाषा में प्रतीकों के लिए यह मामला है (Erlang , क्लोजर, ... और इस समय मैं यही सोच सकता हूं)। – Pointy

+0

यह उत्तर "क्यों" को संबोधित नहीं करता है। – Ben

संबंधित मुद्दे