2012-08-16 12 views
16

What is the difference between parseInt(string) and Number(string) in JavaScript के बीच अंतर क्या पहले पूछा गया है के बीच क्या अंतर है।संख्या (...) और parseFloat (...)

लेकिन जवाब मूल रूप से radix और parseInt की क्षमता "123htg" इस तरह की स्ट्रिंग लेने के लिए और यह 123 में बदलने के लिए पर जोर दिया।

क्या मैं यहाँ पूछ रहा हूँ अगर वहाँ Number(...) और parseFloat(...) के रिटर्न के बीच कोई बड़ा अंतर है जब आप सभी में कोई मूलांक के साथ एक वास्तविक संख्या स्ट्रिंग इसे पारित है।

उत्तर

16

नहीं। दोनों के परिणामस्वरूप आंतरिक ToNumber(string) फ़ंक्शन कहा जा रहा है।

ES5 section 15.7.1 से (संख्या निर्माता एक समारोह के रूप में कहा जाता है):

Number एक समारोह के रूप के बजाय एक निर्माता के रूप में बुलाया है, यह एक प्रकार रूपांतरण करता ...

एक संख्या देता है मूल्य (संख्या संख्या नहीं) ToNumber(value) द्वारा गणना की गई यदि मूल्य प्रदान किया गया था, तो +0 लौटाता है।

ES5 section 15.1.2.3 (parseFloat (स्ट्रिंग)) से:

... तो न trimmedString है और न ही trimmedString संतुष्ट के किसी भी उपसर्ग की वाक्य रचना एक StrDecimalLiteral (देखें 9.3.1) ...

और 9.3.1 "टू टूम्बर एप्लाइड टू स्ट्रिंग टाइप" शीर्षक वाला अनुभाग है, जो कि पहला उद्धरणकहता है।


अद्यतन (टिप्पणी देखें)

new ऑपरेटर के साथ Number निर्माता बुला करके, आप बल्कि एक संख्यात्मक शाब्दिक से, Number वस्तु का एक उदाहरण मिल जाएगा।

typeof new Number(10); //object 
typeof Number(10); //number 

यह section 15.7.2 में परिभाषित किया गया है (संख्या निर्माता): उदाहरण के लिए:

Number यह एक निर्माता है एक new अभिव्यक्ति के हिस्से के रूप में कहा जाता है जब: यह नव निर्मित वस्तु initialises।

+0

तो क्या होता है यदि मैं 'नया नंबर (...) 'करता हूं? यह कैसे भिन्न है? – Neal

+0

'typeof नई संख्या (3) ===" वस्तु "', जबकि 'typeof 3 ===" संख्या "' और 'typeof संख्या (3) ===" संख्या "' – jackwanders

+0

आप एक संख्या वस्तु मिल जाएगा वापस , गैर-सख्त तुलना में यह 'valueOf' विधि कहा जाएगा, लेकिन गैर-वस्तुओं के साथ सख्त तुलना विफल हो जाएगी। यह 'Number' IMO वस्तुओं के साथ चारों ओर गंदगी के लिए सिर्फ एक बुरा विचार है (और के लिए क्या इसके लायक है, Crockford उन्हें या तो पसंद नहीं करता है) –

0

जब new का उपयोग नहीं कर एक संख्यात्मक मूल्य के लिए एक आवरण वस्तु बनाने के लिए, Number बस नंबर करने के लिए स्ट्रिंग से जैसे रूपांतरण कर की चपेट में आ गया है।

'parseFloat' दूसरी ओर, आप का उल्लेख के रूप में, एक चल बिन्दु संख्या किसी भी स्ट्रिंग है कि एक अंकों, एक दशमलव, या +/-

तो साथ शुरू होता है से, पार्स कर सकते हैं अगर आप केवल काम कर रहे हैं तारों के साथ जिसमें केवल संख्यात्मक मान होते हैं, Number(x) और parseFloat(x) परिणामस्वरूप

2

बहुत अंतर नहीं है, जब तक कि आप सुनिश्चित हों कि आपकी स्ट्रिंग में अंकों के अलावा कुछ भी नहीं है। यदि वहां हैं, NumberNaN वापस आ जाएगा।
Number कन्स्ट्रक्टर का उपयोग करने में आपको एक और समस्या यह हो सकती है कि सहकर्मियों को लगता है कि आप new कीवर्ड भूल गए हैं, और इसे बाद में जोड़ सकते हैं, जिससे सख्त तुलना new Number(123) === 123 -> झूठी जबकि Number(123) === 123 -> सत्य है।

सामान्य तौर पर, मैं यह क्या है के लिए Number निर्माता छोड़ने के लिए, और सिर्फ कम से कम वाक्य रचना वहाँ करने के लिए है का उपयोग पसंद करते हैं किसी पूर्णांक/नाव को डाली: +numString, या parse* का उपयोग करें।

18

आंतरिक कार्यप्रणाली अलग नहीं हैं, क्योंकि जेम्स जेम्स अलार्डिक ने पहले से ही उत्तर दिया है। यद्यपि एक अंतर है। parseFloat का उपयोग करके, एक (छंटनी) स्ट्रिंग एक या अधिक संख्यात्मक वर्णों से शुरू होती है जिसके बाद अल्फान्यूमेरिक वर्ण Number के साथ एक संख्या में परिवर्तित हो सकते हैं जो सफल नहीं होगा। में के रूप में:

parseFloat('3.23abc'); //=> 3.23 
Number('3.23abc'); //=> NaN 

दोनों रूपांतरण में, इनपुट स्ट्रिंग माध्यम से छंटनी की है,:

parseFloat(' 3.23abc '); //=> 3.23 
Number(' 3.23 '); //=> 3.23 
+0

+1, यह सच है, लेकिन परिस्थितियों प्रश्न में परिभाषित किया गया है, वहाँ कोई अंतर नहीं है - "जब आप इसे वास्तविक संख्या स्ट्रिंग पास करते हैं"। मान लीजिए कि मैं वैसे भी सही ढंग से समझ गया हूं। –

+0

एक और अंतर यह की '" "' और '" "' जहां दोनों ही मामलों में संख्या दे देंगे 'परिणाम है 0' लेकिन parseFloat' देता NaN'। –

+0

मुझे इसके बारे में पता है। मैंने यह भी कहा कि ओपी में ...यह ** नहीं ** ** मैं क्या पूछ रहा था .... – Neal

-1

कृपया मुझे क्षमा अभी तक एक उत्तर पोस्ट, लेकिन मैं सिर्फ एक गूगल खोज के माध्यम से यहाँ हो गया और किया मैं चाहता था कि सभी विवरण नहीं मिला। Node.js में निम्न कोड चल रहा है:

val=1, Number()=1, parseFloat()=1, if()=true 
val=1.1, Number()=1.1, parseFloat()=1.1, if()=true 
val=0, Number()=0, parseFloat()=0, if()=true 
val=1.1abc, Number()=NaN, parseFloat()=1.1, if()=true 
val=, Number()=0, parseFloat()=NaN, if()=false 
val= , Number()=0, parseFloat()=NaN, if()=true 
val=null, Number()=0, parseFloat()=NaN, if()=false 

कुछ उल्लेखनीय टेकअवे:

var vals = ["1", "1.1", "0", "1.1abc", "", " ", null]; 
for(var i = 0; i < vals.length; i++){ 
    var ifTest = false; 
    if(vals[i]) 
    { 
    ifTest = true; 
    } 
    console.log("val=" + vals[i] + ", Number()=" + Number(vals[i])+ ", parseFloat()=" + parseFloat(vals[i]) + ", if()=" + ifTest); 
} 

निम्नलिखित उत्पादन देता

  1. तो परिवर्तित करने के लिए प्रयास करने से पहले एक अगर (वैल) के साथ की रक्षा संख्या के लिए, फिर parseFloat() व्हाइटस्पेस मामले को छोड़कर एक संख्या वापस कर देगा।
  2. संख्या सफेद-स्थान से अलग गैर-संख्यात्मक वर्णों को छोड़कर सभी मामलों में एक संख्या देता है।

कृपया किसी भी परीक्षण मामले को जोड़ने में संकोच न करें जो मुझे याद आ रही है।

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