जावास्क्रिप्ट पार्सिएंट () अग्रणी शून्य के साथ


120

जावास्क्रिप्ट का parseInt फ़ंक्शन पूरी तरह से काम नहीं करता है।

parseInt("01") returns 1
parseInt("02") returns 2
parseInt("03") returns 3
parseInt("04") returns 4
parseInt("05") returns 5
parseInt("06") returns 6
parseInt("07") returns 7
parseInt("08") returns 0
parseInt("09") returns 0

आप यह नहीं समझा सकते हैं। कोशिश करो। (jsFiddle)

संपादित करें क्योंकि यह प्रश्न पूछा गया था और उत्तर दिया गया था, अष्टक मूलांक को डिफ़ॉल्ट करने की "सुविधा" को हटा दिया गया है। [ ] [ ]


29
आप मजाक कर रहे होंगे
georg

6
You can't explain that. हाँ आप कर सकते हैं => developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
रॉकेट हज़मत

3
उम्र के बाद से, 0 से शुरू होने वाली कोई भी संख्या OCTAL का प्रतिनिधित्व करती है और 0x हेक्सा-डेसीमल का प्रतिनिधित्व करती है। मेरा मानना ​​है कि यह सभी भाषाओं के लिए सार्वभौमिक है, लेकिन फिर से मैं गलत हो सकता हूं।
सेल्वकुमार अरुमुगम

3
FYI करें: jsFiddle , w3schools.com/jsref/tryit.asp की तुलना में बेहतर ऑनलाइन जावास्क्रिप्ट परीक्षक है ।
रॉकेट हज़मत

2
@ जॉनहोर्त्सोक ये, क्योंकि हम दोनों इस पोस्ट पर थे stackoverflow.com/questions/8761997/…
savinger

जवाबों:


181

ऐसा इसलिए है क्योंकि यदि कोई संख्या '0' से शुरू होती है, तो इसे आधार 8 (अष्टक) के रूप में माना जाता है।

आप 2 पैरामीटर के रूप में आधार पास करके आधार को बाध्य कर सकते हैं।

parseInt("09", 10) // 9

डॉक्स के अनुसार , दूसरा पैरामीटर वैकल्पिक है, लेकिन इसे हमेशा 10 नहीं माना जाता है, जैसा कि आप अपने उदाहरण से देख सकते हैं।


1
हाँ, लेकिन अगर यह अष्टाधारी माना जाता है, तो इसे 0. के बजाय 09 के लिए 11 पर लौटना चाहिए
पीयूष कुशवाहा

2
@PeeyushKushwaha: अन्य तरीके से। 11आधार 8 9में आधार 10 09है । वैध 8 आधार नहीं है।
रॉकेट हज़मत

लेकिन मैं parseInt के बाद 09 चाहता हूं, क्या कोई रास्ता नहीं है
परदीप जैन

39

कॉल को parseIntहमेशा दूसरे तर्क में आधार निर्दिष्ट करना चाहिए:

parseInt("08", 10);

जावास्क्रिप्ट के पहले संस्करण 0अष्टक के रूप में शुरू होने वाले तार का इलाज करते हैं (जब कोई आधार निर्दिष्ट नहीं होता है) और न 08ही 09वैध अष्टक संख्या हैं।

मोज़िला दस्तावेज़ से :

यदि मूलांक अपरिभाषित या 0 है, तो जावास्क्रिप्ट निम्नलिखित मानता है:

  • यदि इनपुट स्ट्रिंग "0x" या "0X" से शुरू होती है, तो मूलांक 16 (हेक्साडेसिमल) है।
  • यदि इनपुट स्ट्रिंग "0" से शुरू होती है, तो मूलांक आठ (अष्टक) है। यह सुविधा गैर-मानक है, और कुछ कार्यान्वयन जानबूझकर इसका समर्थन नहीं करते हैं (इसके बजाय मूलांक 10 का उपयोग करके)। इस कारण हमेशा parIInt का उपयोग करते समय एक मूलांक निर्दिष्ट करें
  • यदि इनपुट स्ट्रिंग किसी अन्य मान से शुरू होती है, तो मूलांक 10 (दशमलव) है।

यदि पहले वर्ण को संख्या में परिवर्तित नहीं किया जा सकता है, तो parseInt NaN लौटाता है।

और ECMAScript 3 मानक से:

जब मूलांक 0 या अपरिभाषित होता है और स्ट्रिंग की संख्या 0 अंक से शुरू होती है, जिसके बाद x या X नहीं होता है , तो कार्यान्वयन अपने विवेक से संख्या की व्याख्या कर सकता है या तो अष्टक या दशमलव के रूप में हो सकता है। कार्यान्वयन को दशमलव के रूप में इस मामले में संख्याओं की व्याख्या करने के लिए प्रोत्साहित किया जाता है।

जावास्क्रिप्ट का नवीनतम संस्करण ( ECMAScript 5 ) इस व्यवहार को छोड़ देता है , लेकिन आपको अभी भी पुराने ब्राउज़रों को संतुष्ट करने के लिए मूलांक निर्दिष्ट करना चाहिए ।


चूंकि यह पदावनत है, भविष्य में आप अग्रणी शून्य का उपयोग करने के साथ ठीक हो जाएंगे?
पचेरियर

15

एक मूलांक पैरामीटर है

parseInt(value, base)

जहां आधार मूलांक है।

इस स्थिति में आप बेस 10 (दशमलव) संख्याओं का मूल्यांकन कर रहे हैं, इसलिए उपयोग करें

parseInt(value, 10);

4

यह नए ब्राउज़रों में पूरी तरह से मान्य नहीं है। यदि आप 'parseInt ("08")' निष्पादित करते हैं तो इंटरनेट एक्सप्लोरर 9 और 10 8 वापस आएंगे, जबकि इंटरनेट एक्सप्लोरर 8 और पिछले संस्करण 0 वापस आएंगे (quirks मोड में IE10 भी 0 लौटेगा)।

Chrome का नवीनतम संस्करण 8 भी लौटाता है इसलिए उन्होंने हाल ही में व्याख्या बदल दी होगी।


हां, व्यवहार बदल गया है। मैं अपना जवाब अपडेट करूंगा। developer.mozilla.org/en-US/docs/JavaScript/Reference/…
वेन

1
हां, फ़ायरफ़ॉक्स और क्रोम नवीनतम संस्करण में अब कोई समस्या नहीं है।
पौराणिक

3

यह मुद्दा अभी हटा दिया गया है। लेकिन आप अभी भी मूलांक का उपयोग parseIntअन्य आधारों की संख्या को आधार -10 में परिवर्तित करने के लिए कर सकते हैं । उदाहरण के लिए,

var baseTwoNumber = parseInt('0010001', 2);

प्रतिफल 17(जो कि बेस -10 है 0010001)।


0

युक्ति: जैसा कि अब आप जानते हैं कि जब ऑक्टल को डिफ़ॉल्ट रूप से हटा दिया गया है। यहां बताया गया है कि आप इसे लीगेसी ब्राउज़र में कैसे ठीक करेंगे

// ES-5 15.1.2.2
if (parseInt('08') !== 8 || parseInt('0x16') !== 22) {
    parseInt = (function (origParseInt) {
        var hexRegex = /^0[xX]/;
        return function parseIntES5(str, radix) {
            str = String(str).trim();
            if (!Number(radix)) {
                radix = hexRegex.test(str) ? 16 : 10;
            }
            return origParseInt(str, radix);
        };
    }(parseInt));
}

पुनश्च: यदि आप एक अग्रणी शून्य (एक स्ट्रिंग के बजाय) के साथ एक निरंतर संख्या का उपयोग करते हैं, तो इसे अभी भी सभी मौजूदा ब्राउज़रों में आधार 8 के रूप में माना जाता है।
अगामेन्नुस

0

अधिकांश ब्राउज़र में अब यह समस्या बदल गई है।

फ़ायरफ़ॉक्स 51.0.1 (64-बिट)

parseInt("09")   // 9

Chrome 55.0.2883.95 (64-बिट)

parseInt("09")   // 9

सफारी 10.0 (12602.1.50.0.10)

parseInt("09")   // 9

=====

अनुशंसित अभ्यास

कहा गया है कि, बस सुरक्षित पक्ष पर होने और मुद्दों से बचने के लिए, स्वीकृत उत्तर में सुझाए गए आधार / मूलांक पैरामीटर का उपयोग करें ।

parseInt("09", 10)    // 9

अतिरिक्त परीक्षण

मैं सिर्फ यह परीक्षण करना चाहता था, अगर तर्क एक स्ट्रिंग नहीं है। क्रोम और सफारी सटीक परिणाम देता है। फ़ायरफ़ॉक्स भी उचित परिणाम देता है, लेकिन एक चेतावनी के साथ।

parseInt(09)     // 9. (Warning: SyntaxError: 09 is not a legal ECMA-262 octal constant)

यदि मान 0 से शुरू होता है और एक संख्या है, तो parseInt अभी भी आधार का उपयोग करेगा 8. parseInt (020) आज़माएं
sirrocco

हाँ। मैंने सुझाए गए उत्तर की ओर भी इशारा किया है। और मैं बचने के लिए सर्वोत्तम प्रथाओं और बुरी विशेषताओं को जानता हूं। इसलिए मैंने अपने उत्तर में अनुशंसित अभ्यास दिया है ।
पौराणिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.