स्ट्रिंग को संख्या में जावास्क्रिप्ट में बदलने का सबसे तेज़ तरीका क्या है?


122

कोई भी संख्या, यह संख्या है। स्ट्रिंग नंबर की तरह दिखता है, यह नंबर है। बाकी सब कुछ, यह NaN जाता है।

'a' => NaN
'1' => 1
1 => 1

किसी समय में दिए गए कार्यान्वयन में अनुकूलन पर निर्भर सबसे तेज़ क्या है। कोई उद्देश्यपूर्ण "सबसे तेज़" तरीका नहीं है।
हेट लेजी

2
'1a'स्ट्रिंग के साथ क्या किया जाना चाहिए ? ' 1'एक के साथ ? दूसरे शब्दों में, ऐसा करने के लिए सबसे आम तरीके ( Number(x)और parseInt(x, 10)) आपके लिए पर्याप्त क्यों नहीं हैं?
बारिश।

एक पिछला जेस्पर परीक्षण: jsperf.com/converting-string-to-int/3
epascarello

यहाँ विभिन्न विधियों की तुलना में अच्छा प्रदर्शन है: jsben.ch/#/NnBKM
EscapeNetscape

जवाबों:


192

जहाँ तक मुझे पता है, इसे करने के 4 तरीके हैं।

Number(x);
parseInt(x, 10);
parseFloat(x);
+x;

मेरे द्वारा किए गए इस त्वरित परीक्षण से, यह वास्तव में ब्राउज़रों पर निर्भर करता है।

http://jsperf.com/best-of-string-to-number-conversion/2

Implicit 3 ब्राउज़रों पर सबसे तेज़ चिह्नित किया गया है, लेकिन यह कोड को पढ़ने के लिए कठिन बनाता है ... इसलिए जो भी आप इसे पसंद करते हैं उसे चुनें!


7
दिलचस्प रूप से Google Analytics (आपकी वेबसाइट में आपके द्वारा डाला गया भाग) 1*दिनांक-से-संख्या रूपांतरण के लिए उपयोग होता है, जो +ऊपर दिए गए समान है । के 1*new Date()बजाय +new Date()। संभवतः यह अधिक पठनीय है?
मैथ्यू विलकॉक्सन

1
मुझे लगता 1*है कि यह पसंद किया जाता है क्योंकि यह कम त्रुटि वाला है। एक अवांछित झूलने वाला चर पहले +1पार्सिंग त्रुटि नहीं है। यह प्रयोग करने के समान एक चाल if (MYCONSTANT == myvar)है C
टॉमस

5
@ अपरातक - वर्तमान अनुकूलन देशी रूपांतरण के पक्ष में प्रतीत होते हैं, जैसा कि निहितार्थ के विपरीत है। मैं Windows Server 2008 R2 / 7 और ParseInt () फ़ायरफ़ॉक्स 30.0 में दोनों के लिए सबसे धीमा होने के साथ क्रोम 37.0.2062.124 में नंबर () के लिए सबसे तेज़ हो रहा हूं। इसके अलावा, आप सामान्य तुलना के लिए परीक्षण में स्ट्रिंग शाब्दिक फ़्लोट सहित विचार कर सकते हैं। मेरा अनुमान है कि यह कुछ मामलों में क्रम बदल सकता है क्योंकि स्ट्रिंग से फ्लोट रूपांतरण आम तौर पर स्ट्रिंग से इंट रूपांतरण तक धीमा होता है। अब जिस तरह से परीक्षण किया गया है, वह नंबर () का उपयोग किए जाने पर एक स्ट्रिंग के साथ अंतर रूपांतरण में हो रहा है।
नोलो

1
क्रोम 61.0.3163। संख्या () सबसे तेज है।
दिमित्री पेटुखोव

70

ऐसा करने के लिए कम से कम 5 तरीके हैं:

यदि आप केवल पूर्णांकों में बदलना चाहते हैं, तो एक और तेज़ (और छोटा) तरीका डबल-बिटवाइज़ है (अर्थात दो टिल्ड वर्णों का उपयोग करके):

जैसे

~~x;

संदर्भ: http://james.padolsey.com/cool-stuff/double-bitwise-not/

5 सामान्य तरीके जो मैं अब तक एक स्ट्रिंग को एक संख्या में बदलने के लिए जानता हूं, सभी में उनके अंतर हैं (अधिक बिटवाइज़ ऑपरेटर हैं जो काम करते हैं, लेकिन वे सभी समान परिणाम देते हैं ~~)। यह JSField डिबग कंसोल में आपके द्वारा अपेक्षित विभिन्न परिणामों को दर्शाता है: http://jsfiddle.net/TrueBlueAussie/j7x0q0e3/22/

var values = ["123",
          undefined,
          "not a number",
          "123.45",
          "1234 error",
          "2147483648",
          "4999999999"
          ];

for (var i = 0; i < values.length; i++){
    var x = values[i];

    console.log(x);
    console.log(" Number(x) = " + Number(x));
    console.log(" parseInt(x, 10) = " + parseInt(x, 10));
    console.log(" parseFloat(x) = " + parseFloat(x));
    console.log(" +x = " + +x);
    console.log(" ~~x = " + ~~x);
}

डिबग कंसोल:

123
  Number(x) = 123
  parseInt(x, 10) = 123
  parseFloat(x) = 123
  +x = 123
  ~~x = 123
undefined
  Number(x) = NaN
  parseInt(x, 10) = NaN
  parseFloat(x) = NaN
  +x = NaN
  ~~x = 0
null
  Number(x) = 0
  parseInt(x, 10) = NaN
  parseFloat(x) = NaN
  +x = 0
  ~~x = 0
"not a number"
  Number(x) = NaN
  parseInt(x, 10) = NaN
  parseFloat(x) = NaN
  +x = NaN
  ~~x = 0
123.45
  Number(x) = 123.45
  parseInt(x, 10) = 123
  parseFloat(x) = 123.45
  +x = 123.45
  ~~x = 123
1234 error
  Number(x) = NaN
  parseInt(x, 10) = 1234
  parseFloat(x) = 1234
  +x = NaN
  ~~x = 0
2147483648
  Number(x) = 2147483648
  parseInt(x, 10) = 2147483648
  parseFloat(x) = 2147483648
  +x = 2147483648
  ~~x = -2147483648
4999999999
  Number(x) = 4999999999
  parseInt(x, 10) = 4999999999
  parseFloat(x) = 4999999999
  +x = 4999999999
  ~~x = 705032703

~~x"अधिक" मामलों, जहां दूसरों को अक्सर में परिणाम में एक संख्या में संस्करण परिणाम undefinedहै, लेकिन यह अमान्य इनपुट के लिए विफल रहता है (उदाहरण के लिए यह वापस आ जाएगी 0अगर स्ट्रिंग गैर संख्या वर्ण हैं के बाद एक वैध संख्या)।

बाढ़

कृपया ध्यान दें: पूर्णांक अतिप्रवाह और / या बिट ट्रंकेशन के साथ हो सकता है ~~, लेकिन अन्य रूपांतरण नहीं। हालांकि इस तरह के बड़े मूल्यों में प्रवेश करना असामान्य है, आपको इसके बारे में पता होना चाहिए। उदाहरण को बहुत बड़े मूल्यों को शामिल करने के लिए अद्यतन किया गया।

कुछ पूर्ण परीक्षण यह दर्शाते हैं कि मानक parseIntऔर parseFloatफ़ंक्शंस वास्तव में सबसे तेज़ विकल्प हैं, संभवतः ब्राउज़रों द्वारा अत्यधिक अनुकूलित, लेकिन यह सब आपकी आवश्यकता पर निर्भर करता है क्योंकि सभी विकल्प पर्याप्त तेज़ हैं : http://jsperf.com/best-of-string-to -number-रूपांतरण / 37

यह सब इस बात पर निर्भर करता है कि कुछ टेस्टिंग parseInt / parseFloat के रूप में कितना धीमी गति से पूर्ण परीक्षण कॉन्फ़िगर किया गया है।

मेरा सिद्धांत है:

  • झूठ
  • डै्रन लाइनें
  • आंकड़े
  • JSPerf परिणाम :)

3
2147483647 से बड़ी संख्या के लिए वास्तव में सावधान रहें । उदाहरण के लिए: ~~4294967296रिटर्न 0
जोसेफ गोह

@ जोसेफगोह: जब मुझे मौका मिलेगा तो मैं अंतर श्रेणी अतिप्रवाह को शामिल करने के लिए परिणामों का विस्तार करूंगा। आम तौर पर, यदि संख्या इतनी बड़ी है कि आपके पास एक बहुत ही विशेष इंटरफ़ेस है, तो अतिप्रवाह के बारे में पता होना चाहिए। चीयर्स
कोडिंग किया गया

@ जोसेफगोह: दिलचस्प बात यह है कि क्रोम में, आपको 0 नहीं मिलता है, आपको साइन किए गए अधिकतम मूल्य से पहले नकारात्मक संख्या मिलती है। तब यह केवल अतिरिक्त बिट्स को छोड़ने के लिए प्रकट होता है जब आप अहस्ताक्षरित अधिकतम अधिकतम मान से अधिक हो जाते हैं। जैसे "4999999999" => 705032703
कोडिंग '

8

+ऑपरेटर के साथ स्ट्रिंग को उपसर्ग करें ।

console.log(+'a') // NaN
console.log(+'1') // 1
console.log(+1) // 1

7

तार को पूर्णांक में बदलने का एक तेज़ तरीका बिटवाइज़ का उपयोग करना है या, जैसे:

x | 0

हालांकि यह इस बात पर निर्भर करता है कि इसे कैसे लागू किया जाता है, सिद्धांत रूप में यह अपेक्षाकृत तेज़ होना चाहिए (कम से कम उतना ही तेज़ होना चाहिए +x) क्योंकि यह पहली बार xएक नंबर पर आएगा और फिर एक बहुत ही कुशल या प्रदर्शन करेगा।


हां, लेकिन मेरा मानना ​​है कि यह तकनीक बड़े पूर्णांक को तोड़ देती है, जो कि बहुत बुरा है। ध्यान देने के लिए, मुझे Math.floor () के बजाय भी इस्तेमाल किया जा सकता है, लेकिन उसी मुद्दे के साथ।
जीन

यहाँ पहले जवाब में तरीकों के साथ संयोजन के रूप में विभिन्न बिटवाइज़ ऑपरेटरों का एक जेस्पर है । मैंने आदेश को यादृच्छिक बना दिया क्योंकि मैंने पाया कि कुछ ब्राउज़र पिछले परीक्षण से समान कोड के आधार पर अगले परीक्षण का अनुकूलन करेंगे। शीर्ष उत्तर देने वाले के विपरीत, मैंने पाया कि निहित सबसे खराब तरीका था।
प्लूटो

4

यहाँ यह करने का सरल तरीका है: var num = संख्या (str); इस उदाहरण में str वह चर है जिसमें स्ट्रिंग है। आप परीक्षण कर सकते हैं और देख सकते हैं कि यह कैसे काम करता है: Google क्रोम डेवलपर टूल , फिर कंसोल पर जाएं और निम्न कोड पेस्ट करें। रूपांतरण कैसे किया जाता है यह बेहतर समझने के लिए टिप्पणियों को पढ़ें।

// Here Im creating my variable as a string
var str = "258";


// here im printing the string variable: str
console.log ( str );


// here Im using typeof , this tells me that the variable str is the type: string
console.log ("The variable str is type: " + typeof str);


// here is where the conversion happens
// Number will take the string in the parentesis and transform it to a variable num as type: number
var num = Number(str);
console.log ("The variable num is type: " + typeof num);


3

यह शायद इतना तेज़ नहीं है, लेकिन यह सुनिश्चित करने का अतिरिक्त लाभ है कि आपका नंबर कम से कम एक निश्चित मूल्य (जैसे 0), या अधिक से अधिक एक निश्चित मूल्य है:

Math.max(input, 0);

यदि आपको न्यूनतम मूल्य सुनिश्चित करने की आवश्यकता है, तो आमतौर पर आप ऐसा करेंगे

var number = Number(input);
if (number < 0) number = 0;

Math.max(..., 0) आपको दो कथन लिखने से बचाता है।


उपयोग क्यों नहीं Math.abs(input)? यह तार को धनात्मक संख्याओं में भी परिवर्तित करता है, और कुछ अतिरिक्त वर्णों को बचाता है।
एरोन बिलियन

1
@AaronGillion: Math.max (-5, 0) 0 वापस आएगा; Math.abs (-5) वापस आएगा 5. यह उपयोग के मामले पर निर्भर करता है जो अधिक समझ में आता है।
डैन डस्केल्सस्कू

1
ओह, वूप्स, हाँ, मेरा उपयोग मामला जिस तरह से देर रात मैंने उस टिप्पणी को लिखा था, के दौरान अलग था।
एरोन बिलियन

यदि inputआप संख्या में परिवर्तित नहीं हो सकते हैं, तो आप प्राप्त करेंगेNaN
डोमास मार

0

आप UnitOf , एक माप और डेटा प्रकार रूपांतरण पुस्तकालय का उपयोग करने का प्रयास कर सकते हैं जिसे हमने आधिकारिक तौर पर जारी किया है! UnitOf सुपर फास्ट, आकार में छोटा और बिना किसी त्रुटि या अशक्त / अप्रभावित फेंकने के बिना किसी भी डेटा प्रकार को परिवर्तित करने में कुशल है। डिफ़ॉल्ट मान जिन्हें आप परिभाषित करते हैं या UnitOf की डिफ़ॉल्ट तब लौटा दी जाती है जब रूपांतरण असफल होता है।

//One liner examples
UnitOf.DataType("12.5").toFloat(); //12.5 of type Float is returned. 0 would be returned if conversion failed.
UnitOf.DataType("Not A Num").toInt(10); //10 of type Int is returned as the conversion failed.

//Or as a variable
var unit = UnitOf.DataType("12.5");
unit.toInt(5); //12.5 of type Float is returned. 5 would be returned if the conversion failed.
unit.toFloat(8); // 12 of type Int is returned. 8 would be returned if the conversion failed.

0

सबसे तेज़ तरीका -0 का उपयोग कर रहा है:

const num = "12.34" - 0;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.