मुझे प्रश्न के लिए थोड़ा देर हो चुकी है लेकिन मुझे लगता है कि मैं एक अच्छा जवाब दे सकता हूं।
स्वीकार किए जाते हैं जवाब आप अधिक है कि आप वास्तव में क्या पता कुछ नहीं बताता है, और सवाल अपने आप में उल्लेख: +value
के रूप में काम करता है लेकिन Number(value)
parseInt(value)
के रूप में नहीं।
कुंजी पता करने के लिए वहाँ एक अर्थ अंतरके बीच जैसे रूपांतरण और पार्स करने है।
एक ऑक्टल संख्या स्ट्रिंग दशमलव संख्या के रूप में क्यों डाली जाती है?
क्योंकि Number constructor called as a Function (Number(value)
) और Unary +
Operator (+value
) पर्दे के पीछे ToNumber
आंतरिक आपरेशन का उपयोग करें। उन संरचनाओं का उद्देश्य प्रकार रूपांतरण है।
जब ToNumber
is applied to the String Type एक विशेष व्याकरण उत्पादन का उपयोग किया जाता है, जिसे StringNumericLiteral
कहा जाता है।
यह उत्पादन केवल दशमलव शाब्दिक और हेक्साडेसिमल पूर्णांक शाब्दिक पकड़ कर सकते हैं:
...
StrNumericLiteral :::
StrDecimalLiteral
HexIntegerLiteral
...
वहाँ भी इस व्याकरण और "सामान्य" NumericLiterals
के व्याकरण के बीच अर्थ मतभेद।
एक StringNumericLiteral
:
- पहले किया जा सकता है और/या सफेद स्थान और/या लाइन टर्मिनेटर्स द्वारा पीछा किया।
- दशमलव में आपके पास 0 अंकों की संख्या हो सकती है। कोई ऑक्टल नहीं!
- यह दशमलव + या - इसके संकेत को इंगित करने के लिए पहले किया जा सकता है।
- यह खाली है या केवल सफेद स्थान +0 में परिवर्तित हो गया है।
अब मैं parseInt
और parseFloat
फ़ंक्शंस के साथ जाऊंगा।
उन कार्यों के प्रयोजन स्पष्ट रूप से , जो शब्दार्थ अलग को जैसे रूपांतरण है, उदाहरण के लिए पार्स करने है:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseFloat("3.5GB"); // 3.5
// etc..
उल्लेख है कि parseInt
के एल्गोरिथ्म ECMAScript 5 वीं में बदल लायक है संस्करण विशिष्टता, यह अब एक अग्रणी शून्य के लिए ऑक्टल के रूप में किसी संख्या के रेडिक्स को व्याख्या नहीं करता है:
parseInt("010"); // 10, ECMAScript 5 behavior
parseInt("010"); // 8, ECMAScript 3 behavior
जैसा कि आप देख सकते हैं, जिसने ईएस 3 और ईएस 5 कार्यान्वयन के बीच व्यवहार में incompatibility पेश किया है, और किसी भी संभावित समस्या से बचने के लिए हमेशा रेडिक्स तर्क का उपयोग करने की अनुशंसा की जाती है।
अब अपने दूसरे प्रश्न:
क्यों अष्टाधारी शाब्दिक कठोर मोड में ECMAScript 5 वें संस्करण से बाहर कर दिया जाता है?
वास्तव में, अष्टाधारी शाब्दिक से छुटकारा पाने के इस प्रयास की बात आती है 1999 के बाद अष्टाधारी शाब्दिक प्रस्तुतियों (OctalIntegerLiteral
और OctalEscapeSequence
) ECMAScript 3rd Edition specification के बाद से NumericLiteral
रों के व्याकरण से हटा दिया गया है, वे backwards compatibility के लिए शामिल किया जा सकता है (also in ES5) मानक के पुराने संस्करणों के साथ।
वास्तव में, वे सभी प्रमुख कार्यान्वयन में शामिल हैं, लेकिन तकनीकी रूप से एक ईएस 3 या ईएस 5 अनुपालन कार्यान्वयन उन्हें शामिल नहीं कर सकता है, क्योंकि उन्हें गैर-मानक के रूप में वर्णित किया गया है।
यह पहला कदम था, अब ECMAScript 5 Strict Mode उन्हें पूरी तरह से अस्वीकार करता है।
लेकिन क्यों?
क्योंकि वे एक त्रुटियों की संभावना सुविधा माना जाता था, और वास्तव में, अतीत में वे अनजाने में या कठिन वजह से कीड़े को पकड़ने के लिए - बस parseInt
की अंतर्निहित octals की एक ही समस्या के रूप में -।
अब, सख्त मोड के तहत एक ऑक्टल शाब्दिक SyntaxError
अपवाद का कारण बनता है - वर्तमान में केवल फ़ायरफ़ॉक्स 4.0 बीटा में ही देखा जा सकता है -।
यह एक अच्छा जवाब है और जो मूल रूप से मैं अपेक्षा करता था उससे ज्यादा। मुझे लगता है कि मैंने spec में 'StringNumericLiteral' को अनदेखा किया, और मुझे निश्चित रूप से नहीं पता था कि सफेद-स्थान की अनुमति थी। यह उन चीजों में से एक है, मुझे हमेशा सफेद अंतरिक्ष की उम्मीद है * नैन *। –
धन्यवाद @ एंडी, हाँ, मैं वास्तव में लोगों को आश्चर्यचकित करता हूं कि उदा। 'isNaN (" \ t \ r \ n ") 'रिटर्न' झूठा';) – CMS