कौन सा बेहतर है, संख्या (x) या parseFloat (x)?


146

कौनसा अच्छा है?

मैं इसे केवल कुछ बाइट्स शेविंग के लिए कह रहा हूं, क्योंकि मैं संख्या (x) के बजाय + x का उपयोग कर सकता हूं। क्या पारसेफ्लोट कुछ बेहतर करता है?


2
एकल परिशुद्धता फ़्लोटिंग पॉइंट संख्या एक 32 बिट सिस्टम के साथ-साथ सादे पूर्णांक में 4 बाइट्स पर कब्जा कर लेती है। मुझे नहीं पता है कि जावास्क्रिप्ट कैसे तैरता है, लेकिन मुझे लगता है कि यह बहुत समान है।
ईसाई

5
@Christian: जावास्क्रिप्ट में सभी संख्याएँ डबल सटीक फ़्लोट हैं।
गुफ्फा

1
मैं इस सवाल के लिए यूपी को वोट नहीं देता अगर यह EDIT सेगमेंट के लिए नहीं होता
LaPuyaLoca

जवाबों:


309

ParseFloat और संख्या के बीच का अंतर

parseFloat/ parseIntएक स्ट्रिंग को पार्स करने के लिए है, जबकि Number/ +एक संख्या के लिए एक मान के लिए है। वे अलग तरह से व्यवहार करते हैं। लेकिन पहले आइए देखें कि वे समान व्यवहार कहां करते हैं:

parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000

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

parseFloat('1x'); // => 1
Number('1x'); // => NaN

इसके अलावा, Numberहेक्साडेसिमल इनपुट को समझता है जबकि parseFloatयह नहीं है:

parseFloat('0x10'); // => 0
Number('0x10'); // => 16

लेकिन Numberकेवल सफेद स्थान वाले खाली तारों या तारों के साथ अजीब काम करता है:

parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0

कुल Numberमिलाकर , मुझे यह अधिक उचित लगता है, इसलिए मैं लगभग हमेशा Numberव्यक्तिगत रूप से उपयोग करता हूं (और आप पाएंगे कि बहुत सारे आंतरिक जावास्क्रिप्ट फ़ंक्शन Numberभी इस तरह से उपयोग करते हैं)। यदि कोई टाइप करता है तो '1x'मैं इसे ट्रीट करने के बजाय एक त्रुटि दिखाना पसंद करता हूं जैसे कि उन्होंने टाइप किया था '1'। केवल एक बार जब मैं वास्तव में एक अपवाद बनाता हूं, जब मैं एक शैली को एक संख्या में परिवर्तित कर रहा हूं, जिसमें मामला parseFloatसहायक होता है क्योंकि शैलियाँ एक रूप में आती हैं '3px', जिस स्थिति में मैं 'px'भाग छोड़ना चाहता हूं और बस प्राप्त करना चाहता हूं 3, इसलिए मुझे parseFloatउपयोगी लगता है यहाँ। लेकिन वास्तव में आप जो चुनते हैं वह आप पर निर्भर करता है और इनपुट के कौन से रूप आप स्वीकार करना चाहते हैं।

ध्यान दें कि यूनिरी +ऑपरेटर का उपयोग Numberफ़ंक्शन के रूप में उपयोग करने के समान है:

Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40

इसलिए मैं आमतौर पर सिर्फ +शॉर्ट के लिए उपयोग करता हूं । जब तक आप जानते हैं कि यह क्या करता है, मुझे पढ़ना आसान लगता है।


2
मैं व्हॉट्सएप => 0 व्यवहार Number()को "अजीब" नहीं मानूंगा। मैं इसे और भी अधिक अपेक्षित मानूंगा, व्हॉट्सएप एक खाली मूल्य है लेकिन यह शून्य / अपरिभाषित नहीं है => 0 एक अच्छा परिणाम है। शोकेस के लिए वैसे भी आपके लिए बड़ा (+) :)
jave.web

4
@NathanWall: उल्लेख करना चाहते सकता है कि Number('Infinity') === InfinityजबकिparseInt('Infinity') === NaN
sstur

3
मैं इसके लिए +(यूनीरी प्लस) का उपयोग नहीं करूंगा , क्योंकि यदि आप पिछली पंक्ति के एक अर्धविराम को भूल जाते हैं, तो इसके बजाय एक अतिरिक्त अभिव्यक्ति का मूल्यांकन किया जा सकता है।
जैक्सन

1
उन मामलों के लिए जो वे व्यवहार करते हैं, मुझे पता चला है कि parseFloat 1% से 15% धीमा है, जब एक स्ट्रिंग में दशमलव अंकों की संख्या बढ़ जाती है तो धीमी हो जाती है। मेरे सिस्टम में 1M रन के साथ parseFloat ('1.501') नंबर ('1.501') से 5% धीमा है, और parseFloat ('1.50137585467') नंबर ('1.50137585467') की तुलना में 15% धीमा है। इसलिए, मैं नंबर () के लिए जाता हूं।
बट्टेपन

1
@ ChrisBrownie55 वाह, अच्छा कैच। मुझे नहीं पता था कि parseFloat ऐसा कर सकता है। मुझे लगता है कि इन्फिनिटी एक पूर्णांक नहीं है!
संवत्

9

अंतर यह है कि जब इनपुट "उचित संख्या" नहीं होता है। Numberरिटर्न NaNजबकि parseFloatपार्स करता है "ज्यादा के रूप में यह कर सकते हैं"। अगर parseFloat रिटर्न करते समय खाली स्ट्रिंग Numberरिटर्न पर कहा जाता 0है NaN

उदाहरण के लिए:

Number("") === 0               // also holds for false
isNaN(parseFloat("")) === true // and null

isNaN(Number("32f")) === true
parseFloat("32f") === 32

4
ध्यान दें कि NaN != NaNहालांकि
Wex

@ हेक्स आपको लगता है कि TRUE काNaN != NaN मूल्यांकन करता है - टिप के लिए धन्यवाद!
jave.web

4
उपयोग NaNN () NaN मान के परीक्षण के लिए, isNaN(NaN)रिटर्नtrue
jave.web 19

5

इन उदाहरणों में आप अंतर देख सकते हैं:

Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;

parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;

parseFloat थोड़ा धीमा है क्योंकि यह एक स्ट्रिंग में एक संख्या की पहली उपस्थिति के लिए खोज करता है, जबकि संख्या अवरोधक स्ट्रिंग्स से एक नया नंबर उदाहरण बनाता है जिसमें व्हाट्सएप के साथ संख्यात्मक मान शामिल होते हैं या जिसमें गलत मान होते हैं।

PS यदि आप कुछ सार्वभौमिक प्रकार के रूपांतरण समाधानों में रुचि रखते हैं, तो आप मेरे ब्लॉग में टाइप रूपांतरण के बारे में पोस्ट पढ़ सकते हैं: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html


2

खाली स्ट्रिंग के लिए, वे अलग हैं।

+""और Number("")0 देता है, जबकि parseFloat("")NaN लौटाता है।


2
मैं इतना कहना चाहूंगा कि parseFloat()एक खाली स्ट्रिंग के रूप में इसका सही परिणाम है संख्या नहीं है 0(पढ़ें: NaN) जबकि एक स्ट्रिंग है जिसमें चरित्र "0"IS है 0;
क्रिस्टोफर

+x0न केवल एक रिक्त स्ट्रिंग के लिए बल्कि किसी भी व्हाट्सएप-केवल स्ट्रिंग्स के लिए भी रिटर्न । उदाहरण: +" ", +"\t\t\t", +"\n\n"- उन सभी को देना 0परिणाम के रूप में
लुकाज़ विक्टर

2

जहाँ तक मुझे पता है, और यह केवल सहकर्मियों से अधिक सुना हुआ है, इसलिए पूरी तरह से बीमार हो सकता है, कि parseFloat तेजी से मार्जिन है।

हालांकि आगे के शोध पर, ऐसा लगता है कि यह प्रदर्शन अंतर ब्राउज़र पर निर्भर है।

http://jsperf.com/parseint-vs-parsefloat/6

इन jsPerf परिणामों पर एक नज़र डालें, और आपको कॉल करें। (इसमें + x परीक्षण भी शामिल हैं)

जैसा कि @xdazz के उत्तर में उल्लेख किया गया है, +""और Number("")वापसी 0करते हुए फिर से parseFloat("")लौटता NaNहूं, मैं पार्सफ्लोट के साथ जाऊंगा, क्योंकि एक खाली स्ट्रिंग का मतलब संख्या 0 नहीं है, केवल एक स्ट्रिंग जिसमें चरित्र के साथ "0"0 का मतलब है;


यहां एक और अधिक विस्तृत परीक्षण मछली पकड़ने के लिए एक तेज़ तरीके से परिवर्तित करना है ... parseFloat()अभी भी विजेता है।
mindplay.dk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.