2011-12-20 18 views
5

यह प्रश्न another से बाहर आया है, जो स्ट्रिंग अक्षर के साथ console.dir के व्यवहार से संबंधित है। विशेष रूप से, my answer पर टिप्पणियां देखें।स्ट्रिंग अक्षर के लिए उपलब्ध स्ट्रिंग.प्रोटोटाइप के तरीके क्यों हैं?

जैसा कि हम सभी जानते हैं, String जावास्क्रिप्ट में ऑब्जेक्ट्स में कई विधियां हैं। उन विधियों को String.prototype ऑब्जेक्ट पर परिभाषित किया गया है। उदाहरण के लिए String.prototype.toUpperCase। इसलिए हम इस तरह कर सकते हैं:

var s = new String("hello"), 
    s2 = s.toUpperCase();  //toUpperCase is a method on String.prototype 

हालांकि, हम भी ऐसा कर सकते हैं:

var s = "hello",    //s is a string literal, not an instance of String 
    s2 = s.toUpperCase(); 

जाहिर है, जावास्क्रिप्ट दुभाषिया रूपांतरण/कलाकारों के कुछ फार्म कर रही है जब आप String.prototype की एक विधि फोन एक स्ट्रिंग शाब्दिक पर। हालांकि, मुझे spec में इसका कोई संदर्भ नहीं मिल रहा है।

यह समझ में आता है, अन्यथा आपको किसी भी विधि का उपयोग करने से पहले प्रत्येक स्ट्रिंग को String ऑब्जेक्ट में वर्णित करना होगा, और यह काफी परेशान होगा।

तो मेरा सवाल यह है कि, यह कार्यक्षमता कहां वर्णित है, और क्या मुझे लगता है कि शाब्दिक मूल्य अस्थायी रूप से String के उदाहरण में डाला गया है? क्या मैं इसे सोच रहा हूं और कुछ याद कर रहा हूं?

+1

बीटीडब्ल्यू 'नया स्ट्रिंग (मूल्य) 'नोटेशन 100% बेकार है ... इसका उपयोग न करें। –

+0

मुझे पता है कि यह है। सवाल यह है कि क्यों। यह spec में वर्णित कहां है? –

+1

एक स्ट्रिंग अक्षर एक स्ट्रिंग ऑब्जेक्ट है: 'टाइपोफ "हैलो" === "स्ट्रिंग" 'सत्य लौटाता है। क्या यह इस मुद्दे पर मिलता है? – bbg

उत्तर

7

यह यहाँ परिभाषित किया है:

निम्नलिखित [[जाओ]] आंतरिक विधि getValue द्वारा प्रयोग किया जाता है जब वी एक आदिम आधार मूल्य के साथ एक संपत्ति संदर्भ है। इसे आधार का उपयोग इस मूल्य के रूप में और संपत्ति पी के साथ इसके तर्क के रूप में किया जाता है। निम्नलिखित चरणों को लिया जाता है:

  1. चलो ओओ टू ऑब्जेक्ट (बेस)।
  2. संपत्ति के नाम पी [
  3. के साथ ओ [[GetProperty]] आंतरिक विधि को कॉल करने का परिणाम होने दें, यदि desc अपरिभाषित है, तो अपरिभाषित लौटें।
  4. यदि IsDataDescriptor (desc) सत्य है, तो वापसी करें। [[मान]]।
  5. अन्यथा, IsAccessorDescriptor (desc) सत्य होना चाहिए, इसलिए गेटटर उतरें। [[प्राप्त करें]]।
  6. यदि गेटटर अनिर्धारित है, तो अपरिभाषित लौटें।
  7. इस मूल्य के रूप में आधार प्रदान करने वाले गेटर के [[कॉल]] आंतरिक विधि को कॉल करने और कोई तर्क प्रदान करने वाले परिणाम को वापस न करें।

नोट चरण 1 में बनाया गया ऑब्जेक्ट उपरोक्त विधि के बाहर तक पहुंच योग्य नहीं है। एक कार्यान्वयन वस्तु के वास्तविक निर्माण से बचने के लिए चुन सकता है। एकमात्र ऐसी स्थिति जहां वास्तविक आंतरिक पहुंच जो इस आंतरिक विधि का उपयोग करती है, प्रभाव हो सकती है जब यह एक एक्सेसर फ़ंक्शन का आह्वान करता है।

स्रोत:http://es5.github.com/#x8.7.1

आदिम स्ट्रिंग मान कदम 1.


उदाहरण 1

var str = 'some string'; 
str = str.toUpperCase(); 

यहाँ, अभिव्यक्ति में एक वस्तु के लिए मजबूर कर रहा है str.toUpperCase अर्थ विज्ञान 11.2.1 Property Accessors में परिभाषित के अनुसार मूल्यांकन किया जाता है:

  1. पहचानकर्ता str पहचानकर्ता संकल्प (10.2.2.1 GetIdentifierReference देखें) के अनुसार मूल्यांकन किया जाता है। परिणाम एक संदर्भ है जिसका मूल मूल्य वर्तमान शब्दावली पर्यावरण का पर्यावरण रिकॉर्ड है, और जिसका संदर्भित नाम "str" है। यह संदर्भ आधार संदर्भ है।
  2. बेसवैल्यूGetValue(baseReference) निष्पादित करके निर्धारित किया जाता है। चूंकि बेस रेफरेंस एक संपत्ति संदर्भ नहीं है (इसका मूल मान एक वस्तु या मूल मूल्य नहीं है, लेकिन एक पर्यावरण रिकॉर्ड है), संदर्भ के मान को पुनर्प्राप्त करने के लिए GetBindingValue() विधि को कॉल किया जाता है। यह विधि स्थानीय चर str का मान देता है, यानी आदिम स्ट्रिंग मान 'some string'। यह मान आधार वैल्यू है।
  3. propertyNameValue आदिम स्ट्रिंग मान 'toUpperCase' का मूल्यांकन करता है। (मैं इस प्रक्रिया सरलता के लिए थोड़ा छोटा कर दिया है।)
  4. जिसका आधार मूल्य baseValue और जिसका संदर्भित नाम propertyNameValue है एक नया संदर्भ बनाया जाता है।

तो, दो इस प्रक्रिया में शामिल संदर्भ देखते हैं:

  • str (आधार मूल्य: पर्यावरण रिकॉर्ड, संदर्भित नाम: 'str')
  • str.toUpperCase (आधार मूल्य: 'some string', संदर्भित नाम: 'toUpperCase')

अंत में, आमंत्रण ऑपरेटर () बाद के संदर्भ पर निष्पादित किया गया है। उस संदर्भ का मूल्य इस उत्तर के शीर्ष पर परिभाषित अर्थशास्त्र के अनुसार निर्धारित किया गया है।

उदाहरण 2

var str = 'some string'.toUpperCase(); 

यहाँ, अभिव्यक्ति 'some string'.toUpperCase उदाहरण 1 में के रूप में ही "संपत्ति Accessor" अर्थ विज्ञान के अनुसार मूल्यांकन किया जाता है:

  1. स्ट्रिंग शाब्दिक 'some string' स्पष्ट रूप से करने के लिए मूल्यांकन करता है आदिम स्ट्रिंग मान 'some string'। यह आधार संदर्भ है। (नाम को आपको भ्रमित न करने दें - यह एक स्ट्रिंग मान है, संदर्भ नहीं।)
  2. बेसवैल्यूGetValue(baseReference) निष्पादित करके निर्धारित किया जाता है। चूंकि बेस रेफरेंस कोई संदर्भ नहीं है, विधि केवल तर्क मान देता है, यानी बेसवैल्यू = बेस रेफरेंस

आप देख सकते हैं, बस उदाहरण 1 में की तरह, baseValue आदिम स्ट्रिंग मान 'some string' है। चरण 3 और 4, चरण 3 और 4 के उदाहरण में 1.

तो के बराबर हैं दोनों पहचानकर्ता संदर्भ str और स्ट्रिंग शाब्दिक 'some string' एक ही मूल्य का मूल्यांकन - आदिम स्ट्रिंग मान 'some string' - और यह कि मूल्य प्रयोग किया जाता है नए संदर्भ के लिए बेसवैल्यू के रूप में जिसे () के साथ बुलाया गया है। और चूंकि इस संदर्भ में एक मूल आधार मूल्य है, इसलिए मेरे उत्तर की शुरुआत में परिभाषित अर्थशास्त्र लागू होते हैं।

+0

आह-हा! बहुत बहुत धन्यवाद :) –

+0

मैंने इसे भी पढ़ा, लेकिन संदर्भ से संबंधित एक स्ट्रिंग शाब्दिक कैसे है? एक संदर्भ क्या है, या अधिक सटीक होने के लिए, हल किए गए नाम को बाध्यकारी क्या है? –

+0

'+ 1' - मैं इसकी तलाश में था! –

2

यह वही है जो यह कर रहा है।

जावास्क्रिप्ट boxes आवश्यकतानुसार प्राचीन प्रकार।

http://princepthomas.blogspot.com/2011/07/auto-boxing-javascript-primitive-types.html

+0

जैसा कि मैंने माना है, लेकिन मैं अभी भी इसे ECMAScript spec में नहीं ढूंढ सकता। क्या आप जानते हैं कि वहां इस व्यवहार का वर्णन किया गया है या नहीं? –

1

the reference शाब्दिक प्रति वस्तुओं के लिए बदल रहे हैं:

स्ट्रिंग शाब्दिक (डबल या एकल उद्धरण से चिह्नित) और तार लौटे स्ट्रिंग से कॉल

यहाँ कुछ अधिक जानकारी दी गई एक गैर-कन्स्ट्रक्टर संदर्भ (यानी, नए कीवर्ड का उपयोग करके के बिना) आदिम तार हैं। जावास्क्रिप्ट स्वचालित रूप से प्राइमेटिव्स और स्ट्रिंग ऑब्जेक्ट्स को परिवर्तित करता है, ताकि प्राइमेटिव स्ट्रिंग्स के लिए स्ट्रिंग ऑब्जेक्ट विधियों का उपयोग करना संभव हो।

+0

जैसा कि मैंने माना है, लेकिन मैं अभी भी इसे ECMAScript spec में नहीं ढूंढ सकता। क्या आप जानते हैं कि वहां इस व्यवहार का वर्णन किया गया है या नहीं? –

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