2016-01-19 3 views
8

जावास्क्रिप्ट में Symbol एस पर प्रलेखन पढ़ना, और कुछ वातावरण (क्रोम, फ़ायरफ़ॉक्स, नोड.जेएस) में भी परीक्षण करना, मुझे एहसास हुआ है कि अंतर्निहित स्ट्रिंग रूपांतरण की मेरी समझ त्रुटिपूर्ण है।प्रतीकों: जावास्क्रिप्ट में निहित स्ट्रिंग रूपांतरण कैसे काम करता है?

मैं धारणा है कि वस्तु के toString() विधि जब एक स्ट्रिंग के लिए कनवर्ट करने का प्रयास कर बुलाया गया था के तहत हमेशा था, और अगर उस समारोह एक आदिम वापस नहीं किया था, तो यह वस्तु की toPrimitive() विधि कहा जाता है, तो अगर वह नहीं था काम करें यह टाइप-त्रुटि होगी। हालांकि, इस स्पष्टीकरण को कवर करने के TypeError कि Symbol रों फेंक विफल रहता है:

var sym = Symbol("test"); 
 

 
try { 
 
    console.log(sym + "ing"); 
 
} catch (error) { 
 
    console.error(error); 
 
}

TypeError: Cannot convert a Symbol value to a string 

लेकिन यह स्पष्ट है कि Symbol रों एक वैध toString() विधि है। तो इसे क्यों नहीं कहा जाता है?

उत्तर

5

आप सही हैं कि ऑब्जेक्ट स्ट्रिंग रूपांतरण करते समय toString विधि को ऑब्जेक्ट कहा जाता है। हालांकि, as the spec states, प्रतीकों पर निहित स्ट्रिंग रूपांतरण TypeError का कारण बनता है।

Dr. Axel Rauschmayer put it के रूप में:

देखते हुए कि दोनों तार और प्रतीकों संपत्ति कुंजी हो सकता है, अगर आप गलती से एक स्ट्रिंग के लिए एक प्रतीक परिवर्तित करने से लोगों की रक्षा करना चाहते हैं।

+0

यह मेरे प्रश्न का उत्तर नहीं देता है: प्रतीक कैसे टाइप-त्रुटि की क्षमता को कार्यान्वित करता है और एक अंतर्निहित प्रकार-रूपांतरण के डिफ़ॉल्ट वर्कफ़्लो को सर्कवेट करता है? –

+1

@ पैट्रिक रॉबर्ट्स सरल जवाब है "क्योंकि कल्पना इतनी कहती है"। वास्तविक जवाब यह होगा कि इंजन कार्यान्वयनकर्ताओं को spec का पालन करना होगा ताकि वे अपने आंतरिक में कुछ लागू कर सकें जो जांचता है कि एक स्ट्रिंग प्रकार रूपांतरण में 'प्रतीक' शामिल है या नहीं, तो अपवाद फेंकता है। 'प्रतीक' स्वयं इस व्यवहार को संभाल नहीं करता है। –

+0

तो त्रुटि टाइप करने का कारण जावास्क्रिप्ट से सुलभ मैकेनिक के कारण नहीं है? –

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