क्यों किसी को भी इस समारोह (इस तरह व्यवहार करने के लिए एक पूर्णांक लौट चाहेगा तो भी यह सटीक नहीं है पारित स्ट्रिंग का प्रतिनिधित्व)?
क्योंकि समय के सबसे अधिक (अब तक) आप आधार 10 की संख्या के साथ काम कर रहे हैं, और उस मामले में जे एस सिर्फ डाली कर सकते हैं - एक नंबर करने के स्ट्रिंग - पार्स नहीं। (संपादित करें: स्पष्ट रूप से केवल बेस -10 नहीं; नीचे अपडेट देखें।)
चूंकि जेएस गतिशील रूप से टाइप किया गया है, इसलिए कुछ तार आपके हिस्से पर किसी भी काम के बिना संख्याओं के ठीक ठीक काम करते हैं। उदाहरण के लिए:
"21"/3; // => 7
"12.4"/4; // => 3.1
वहाँ parseInt
के लिए कोई ज़रूरत नहीं है, क्योंकि "21"
और "12.4"
अनिवार्य रूप से संख्या पहले से ही कर रहे हैं। यदि, हालांकि स्ट्रिंग "12.4xyz"
थी तो आपको NaN
को विभाजित करते समय वास्तव में प्राप्त होगा, क्योंकि यह निश्चित रूप से एक संख्या नहीं है और इसे स्पष्ट रूप से कास्ट या कॉरसेड नहीं किया जा सकता है।
आप Number(someString)
के साथ एक स्ट्रिंग को स्पष्ट रूप से "कास्ट" भी कर सकते हैं।
हालांकि यह केवल आधार 10,
का समर्थन करता है, यह वास्तव में अमान्य तारों के लिए NaN
लौटाएगा।
इसलिए क्योंकि जेएस के पास पहले से ही निहित और स्पष्ट प्रकार का कास्टिंग/रूपांतरण/जबरन है, parseInt
की भूमिका अभी तक एक और प्रकार का कास्टिंग फ़ंक्शन नहीं है।
parseInt
की भूमिका इसके बजाय, पार्सिंग फ़ंक्शन के बजाय है। एक ऐसा फ़ंक्शन जो इसके इनपुट को समझने के लिए सबसे अच्छा प्रयास करता है, जो वह कर सकता है उसे लौटता है। यह तब होता है जब आपके पास स्ट्रिंग है नहीं डाला जा सकता है क्योंकि यह बिल्कुल पूरी तरह से संख्यात्मक नहीं है। (और, जेएस के मूल वाक्यविन्यास की तरह, यह सी की याद दिलाता है, क्योंकि एपिलर्स के उत्तर अच्छी तरह से समझाया गया है।)
और चूंकि यह एक पार्सर है, एक कास्टिंग फ़ंक्शन नहीं है, इसलिए इसे 10 से अधिक अन्य अड्डों को संभालने में सक्षम होने की अतिरिक्त सुविधा मिल गई है। ।
अब, तुम क्यों नहीं है एक सख्त
कास्टिंग समारोह है कि गैर आधार -10 संख्या संभालती पूछ सकते हैं, और शिकायत की तरह आप चाहते हैं, लेकिन ... अरे, वहाँ बस नहीं है। जेएस के डिजाइनरों ने अभी फैसला किया है कि
parseInt
पर्याप्त होगा, क्योंकि, फिर से 0x63 प्रतिशत, आप आधार 10 से निपट रहे हैं।
var hexString = "dsff66";
var number = eval("0x" + hexString); // attempt to interpret as a hexadecimal literal
which'll फेंक एक
SyntaxError
क्योंकि
0xdsff66
मान्य हेक्स शाब्दिक नहीं है:
निकटतम आप "कास्टिंग" करने के लिए प्राप्त कर सकते हैं शायद कुछ बुरी hacky की तरह है।
अद्यतन: Lekensteyn टिप्पणी में बताते हैं के रूप में, जे एस प्रकट होता है ठीक से 0x
-prefixed हेक्साडेसिमल तार भी कास्ट करने के लिए। मैं यह नहीं पता था, लेकिन वास्तव में यह काम करने के लिए लगता है:
1 * "0xd0ff66"; // => 13696870
1 * "0xdsff66"; // => NaN
जो इसे एक संख्या के लिए एक हेक्स स्ट्रिंग कास्ट करने के लिए सबसे आसान तरीका है - और NaN
प्राप्त करता है, तो यह ठीक से प्रदर्शित नहीं किया जा सकता है।
वही व्यवहार Number()
पर लागू होता है, उदा Number("0xd0ff66")
एक पूर्णांक देता है, और Number("0xdsff66")
रिटर्न NaN
।
(/अद्यतन)
वैकल्पिक रूप से, आप स्ट्रिंग पहले उनकी जांच और NaN
वापसी यदि आवश्यक हो तो कर सकते हैं:
function hexToNumber(string) {
if(!/^(0x)?[0-9a-f]+$/i.test(string)) return Number.NaN;
return parseInt(string, 16);
}
ध्यान दें कि आप 'parseInt की तरह कुछ करते हैं (" 2foo ", 10) 'आपको '2' मिलता है। यह उम्मीद के रूप में है। यह पहले गैर-अंकीय चरित्र –
तक पार्स करता है * मेरी राय में, इसे NaN वापस करना चाहिए। क्या कोई मुझे बता सकता है कि यह क्यों नहीं करता है? * क्योंकि कल्पना कहती है कि यह नहीं होना चाहिए। और दुर्भाग्यवश, मेरी राय या तुम्हारी कल्पना से कोई फर्क नहीं पड़ता। –
'यदि parseInt एक वर्ण से मुठभेड़ नहीं करता है जो निर्दिष्ट रेडिक्स में कोई अंक नहीं है, तो यह इसे और सभी सफल वर्णों को अनदेखा करता है और उस बिंदु तक पार्स किए गए पूर्णांक मान देता है। स्रोत: https://developer.mozilla.org/en- यूएस/डॉक्स/वेब/जावास्क्रिप्ट/संदर्भ/ग्लोबल_ऑब्जेक्ट्स/पैरासेन्ट –