2012-05-02 7 views
5

जब से मैं जे एस के साथ काम करना शुरू किया, मैं एक नंबर शाब्दिक पर एक समारोह को लागू करने का एकमात्र तरीका सोचा है, कोष्ठक के साथ लपेटकर द्वारा अभिव्यक्ति की स्थिति में डाल दिया है ताकि तरह है:जेएस में संख्या अक्षर पर कार्यों का आह्वान करने के नियम क्या हैं?

1.toString(); 
// SyntaxError: identifier starts immediately after numeric literal 

(1).toString(); 
// "1" 

आज यह, इसे करने के लिए मेरे पास हुआ:

0.1.toString(); 
// "0.1" 

यह क्यों काम करता है? आधिकारिक कल्पना में एक सूचक महान होगा।

संपादित करें अस्पष्टता मेरा पहला विचार था, लेकिन फिर निर्णय लिया कि 1.toString() में कोई अस्पष्टता नहीं है। मैंने पहले सोचा जितना गहरा है, लेकिन मुझे अभी भी लगता है कि मैं सही हूं।

संपत्ति के नाम अंक

var obj = { "1" : 1, "2" : 2 }; 

संपत्ति ऐसे नाम हैं जो अंक के साथ शुरू ही वर्ग कोष्ठक

obj.1; 
// SyntaxError: Unexpected token ILLEGAL 
obj['1']; 
// 1 

इसके अलावा के साथ संदर्भित किया जा सकता के साथ शुरू कर सकते हैं:: यहां इसका कारण

1['toString'](); 
// '1' 

इसलिए, 1. कोई भी गैर-अंकों के बाद हमेशा एक विधि कॉल या संपत्ति का उपयोग होगा, कभी दशमलव संख्या नहीं होगी। इसी तरह, 1. किसी भी अंक के बाद हमेशा दशमलव संख्या होगी, कभी भी विधि कॉल या संपत्ति का उपयोग नहीं होगा।

+1

एक नोट के रूप में, आप '1..toString()' का उपयोग कर सकते हैं, पहले '.' दशमलव बिंदु इंगित करता है, दूसरा फ़ंक्शन के लिए उपयोग इंगित करता है। – zzzzBov

+1

संबंधित: http://stackoverflow.com/q/2300197 – CMS

+0

चालाक, धन्यवाद zzzzBov और सीएमएस। – mwcz

उत्तर

5

एक बार जब यह पहली .0.1 में देखा है, फिर अगले .संख्या का हिस्सा नहीं हो सकता है।

यह सब अस्पष्टता के बारे में है।

संपादित — कल्पना की धारा 7.8.3 स्पष्ट रूप से इस पर जोर:

स्रोत चरित्र तुरंत एक NumericLiteral निम्नलिखित एक IdentifierStart या DecimalDigit नहीं होना चाहिए।

मुझे यकीन है कि वास्तव में क्या रोकने के लिए कोशिश कर रहा है नहीं कर रहा हूँ, लेकिन जावास्क्रिप्ट lexer सुंदर ऐंठा हुआ है, ज्यादातर regex शाब्दिक व्याकरण और एक अजीब पार्सर lexer के लिए की जरूरत हैक कि के साथ सौदा करने के लिए धन्यवाद।

+0

मुझे नहीं लगता कि यहां कोई अस्पष्टता है। तर्क के साथ मेरा प्रश्न अपडेट कर रहा है। मैं उस वाक्य से spec से उलझन में हूँ ... '0.1.toString()' मान्य है, लेकिन मुझे एक NumericLiteral की तरह तुरंत एक decimalDigit के रूप में देखता है। – mwcz

+0

@mwcz हां, मैं मानता हूं कि कोई * स्पष्ट * अस्पष्टता नहीं है, लेकिन इस आग्रह के लिए कुछ अस्पष्ट कारण हो सकता है कि मामले को एक त्रुटि के रूप में माना जाए। कल्पना किसी वास्तविक विवरण में नहीं जाती है। और '0.1.toString' * दशमलव संख्या के बाद एक संख्यात्मक शाब्दिक नहीं है: यह एक संख्यात्मक अक्षर है जिसके बाद' .' वर्ण होता है, जो न तो दशमलव अंक है और न ही पहचानकर्ता प्रारंभ होता है। – Pointy

+0

आह, धन्यवाद। मैंने '.' को देखा और इसे '.' से अलग नहीं कर सका :) मैंने अस्पष्टता के खिलाफ तर्क जोड़ा है, हालांकि मुझे लगता है कि आप इसे स्वतंत्र रूप से पहुंचे हैं। – mwcz

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