2012-10-11 21 views
8

मैंने एक साधारण विस्तार विधि लिखा था।जावास्क्रिप्ट में 987 और (987) के बीच क्या अंतर है?

Number.prototype.toMillion = function(){ 
if(!Number.isNaN){ 
    return this/1000000; 
} 
} 

987654321.toMillion() को जन्म देती है:

SyntaxError: Unexpected token ILLEGAL

लेकिन (987654321).toMillion() काम करता है।

तो मेरा सवाल है: 987 और (987) के बीच क्या अंतर है?

बस FYI:

typeof(987) => returns "number" 

और

typeof((987)) still returns "number" 
+2

Whya क्या आप 'Number.isNaN' की जांच कर रहे हैं? क्या आपका मतलब 'this.isNaN()' है? – David

+0

नीचे दिए गए उत्तरों के अतिरिक्त, जांचें: '987654321..to मिलियन()' – Izkata

+1

@ डेविड - यह सिर्फ 'isNaN (यह)' होगा (यह वैश्विक कार्य है, न कि 'नंबर.प्रोटोटाइप'' की संपत्ति। –

उत्तर

11

पार्सर कैसे पता होगा कि . चरित्र निम्न भाग एक विधि कॉल के बजाय की संख्या का एक और हिस्सा सूचित करने के लिए क्या मतलब है? उदाहरण के लिए:

10.1 // This is a number with a floating point 
10.toMillion() //How does it know that this shouldn't be part of the number? 

इसी कारण से, आप संख्यात्मक अक्षरों पर विधियों को कॉल नहीं कर सकते हैं। शाब्दिक कोष्ठक (grouping operator) में रखकर, रनटाइम निहित अभिव्यक्ति का मूल्यांकन करेगा और उस मूल्यांकन के परिणामस्वरूप विधि लागू करेगा।

ग्रुपिंग ऑपरेटर . चरित्र की अस्पष्टता को हटा देता है।


अद्यतन

कुछ सोचा और कल्पना के माध्यम से कुछ जांच के बाद, इसका कोई खास कारण क्या . चरित्र इस प्रकार यह निर्धारित करने के लिए एक अग्रदर्शी के उपयोग की अनुमति नहीं करने के लिए है का हिस्सा है या एक संपत्ति पहचानकर्ता।

टिप्पणियों में उल्लिखित @ साइग्नसएक्स 1 के रूप में, आप दोनों स्थितियों (. के बाद एक अंक और . के बाद एक गैर-संख्यात्मक चरित्र के बाद) को एक लुकहेड के उपयोग से अलग किया जा सकता है। चूंकि पहचानकर्ता संख्या से शुरू नहीं कर सकते हैं, यदि कोई संख्यात्मक वर्ण . का पालन करता है, तो यह एक संख्या होनी चाहिए। यदि एक गैर-संख्यात्मक वर्ण . का पालन करता है, तो यह संख्या का हिस्सा नहीं हो सकता है। लेकिन यह बिल्कुल सही नहीं है।

एक स्थिति है जिसमें एक गैर संख्यात्मक कैरेक्टर . चरित्र का अनुसरण कर सकते, लेकिन अभी भी नंबर का हिस्सा बनने नहीं है:

console.log(1.e5); // Logs '100000' 

e इंगित करता है कि क्या इस प्रकार प्रतिपादक है, और यह कर सकते हैं या तो लोअरकेस या अपरकेस हो। इस कारण से, लुकहेड का उपयोग करके ध्यान रखना होगा कि . के बाद वाला वर्ण e या E है, तो यह अभी भी किसी विधि या संख्या का हिस्सा प्रस्तुत कर सकता है। संख्यात्मक अक्षर पर गुणों के उपयोग को अस्वीकार करना आसान है।

+0

आपने मुझे इसे हरा दिया;) –

+0

पार्सर इसे आगे देखकर निर्णय ले सकता है। यदि डॉट के बाद तत्व पहचानकर्ता है, तो बिंदु संख्या का हिस्सा नहीं होना चाहिए। हालांकि, टॉर्स्टन वाल्टर के उदाहरण के अनुसार - चूंकि सदस्य स्वयं संख्याएं हो सकते हैं, यह अब संभव नहीं है। – CygnusX1

+0

@ CygnusX1 - टोरस्टन का दूसरा उदाहरण एक वाक्यविन्यास त्रुटि है। आप इस तरह की संख्यात्मक गुणों को परिभाषित नहीं कर सकते हैं (क्योंकि पहचानकर्ता संख्या से शुरू नहीं हो सकते हैं)। –

5

. जावास्क्रिप्ट में अधिभारित है।

123.123   // the interpreter assumes this is a floating point number 
(123).123  // throws a syntax error, since an identifier 
       // can't start with a number. - thanks James for pointing that out 
(123).toMillion // refers to the function of the object returned by 
       // the statement in braces 
123.toMillion // will throw a syntax error because a floating point number has only digits 
+1

ध्यान दें कि आपका दूसरा उदाहरण वास्तव में एक वाक्यविन्यास त्रुटि फेंकता है, क्योंकि एक पहचानकर्ता किसी संख्या से शुरू नहीं कर सकता है। –

1

जब 987654321.toMillion() पार्स किया गया है "अवधि" अंश का परिसीमक के रूप में व्याख्या की है। तो यदि आप किसी ऑब्जेक्ट के रूप में संख्या का उपयोग करना चाहते हैं तो आपको इसे ब्रेसिज़ से लपेटने की आवश्यकता है।

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