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


517

संख्या को स्ट्रिंग में बदलने का "सबसे अच्छा" तरीका क्या है (गति लाभ, स्पष्टता लाभ, स्मृति लाभ, आदि के संदर्भ में)?

कुछ उदाहरण:

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""

जवाबों:


516

इस तरह:

var foo = 45;
var bar = '' + foo;

वास्तव में, भले ही मैं आम तौर पर इसे सरल सुविधा के लिए करता हूं, 1,000 से अधिक पुनरावृत्तियों में यह कच्ची गति के लिए प्रकट होता है , इसके लिए एक फायदा है.toString()

यहां प्रदर्शन परीक्षण देखें (मेरे द्वारा नहीं, लेकिन जब मैं अपना लिखने के लिए गया तो पाया गया): http://jsben.ch/#/#QQR

ऊपर दिए गए JSPerf टेस्ट के आधार पर सबसे तेज़: str = num.toString();

यह ध्यान दिया जाना चाहिए कि गति में अंतर अत्यधिक महत्वपूर्ण नहीं है जब आप विचार करते हैं कि यह किसी भी तरह से 1 मिलियन बार 0.1 सेकंड में रूपांतरण कर सकता है ।

अद्यतन: गति ब्राउज़र द्वारा बहुत भिन्न होती है। Chrome में num + ''इस परीक्षण के आधार पर सबसे तेज़ प्रतीत होता है http://jsben.ch/#/ghQYR

अद्यतन 2: फिर से ऊपर मेरे परीक्षण के आधार पर यह ध्यान दिया जाना चाहिए कि फ़ायरफ़ॉक्स 20.0.1 नमूना .toString()की तुलना में लगभग 100 गुना धीमा है '' + num


58
ऐसे मामले हैं जहां रूपांतरण एक बेहतर जवाब नहीं दे सकता है: '' + 123e-50रिटर्न "1.23e-48"
hongymagic

21
@hongymagic: वह उत्तर वास्तव में एकमात्र बोधगम्य है: संख्या की परवाह नहीं है और न ही यह पता है कि यह कैसे दर्ज किया गया था, और मानक मुद्रित प्रतिनिधित्व डॉट से पहले एक अंक के साथ है।
Svante

4
मैंने jsben.ch/ghQYR में परीक्षण चलाया , हर बार यह मुझे एक अलग परिणाम दिखाता है!
मरियम सईदी

2
मुझे यह उत्तर पसंद है क्योंकि null fooकोई त्रुटि नहीं है।
ttugates

2
@MaryamSaeidi: का प्रयोग drublic के jsperf.com परीक्षण ऊपर और अधिक सुसंगत लगता है।
गिरलड़ी

364

मेरी राय में n.toString()इसकी स्पष्टता के लिए पुरस्कार लेता है, और मुझे नहीं लगता कि यह कोई अतिरिक्त उपरि वहन करता है।


यह कुछ उपरि ले जाता है भले ही यह हाल के ब्राउज़र संस्करणों में महत्वहीन हो। फ़ायरफ़ॉक्स क्वांटम में कम से कम
peterchaula

11
यह असुरक्षित है। n शून्य या अपरिभाषित हो सकता है।
david.pfx

20
@ david.pfx प्रश्न पूछता है कि कैसे एक स्ट्रिंग के लिए संख्यात्मक मान परिवर्तित करने के लिए। गैर-संख्यात्मक मान (उदाहरण nullके लिए undefined) के उदाहरण प्रदान करना जो इस उत्तर के साथ काम नहीं करते हैं, शायद ही इसे "असुरक्षित" बनाता है।
माइकल मार्टिन-स्मकर

5
@ MichaelMartin-Smucker: यदि आप बहुत सारे जेएस लिखते हैं तो आपको पता चलता है कि चीजें शायद ही कभी कटती हैं और सूख जाती हैं। प्रश्न खुला था और IMO को एक अच्छे उत्तर में कम से कम एक स्ट्रिंग के मुद्दे को स्वीकार करना चाहिए जो वास्तव में अशक्त या अपरिभाषित है। YMMV।
david.pfx

@ david.pfx मैंने बहुत सारे js लिखे हैं और मुझे पिछली बार याद नहीं है कि मुझे एक स्ट्रिंग के रूप में नंबर की आवश्यकता थी और कुछ भी लेकिन एक स्ट्रिंग के रूप में एक संख्या पर्याप्त होगी। यह सही जवाब है। संभालने का कोई जवाब नहीं है nullया undefinedजैसा कि यह विशिष्ट है, जबकि मैं कल्पना करता हूं (n || defaultNumber).toString() कि ज्यादातर लोग ऐसी स्थिति में क्या चाहते हैं मैं दृढ़ता से असहमत हूं, हमें इसे सभी सवालों में काम करना चाहिए। यह संख्याओं को स्ट्रिंग्स, अच्छी वास्तुकला और अन्य प्रकार के रूपांतरणों में परिवर्तित करने के बारे में था, जहां अलग-अलग पाठों की आवश्यकता होती है।
जॉर्ज रीथ

73

स्पष्ट रूपांतरण किसी ऐसे व्यक्ति के लिए बहुत स्पष्ट हैं जो भाषा के लिए नया है। यदि किसी डेवलपर ने जोर-जबरदस्ती के नियमों के बारे में जानकारी नहीं दी है, तो टाइप कॉर्शन का उपयोग करना, जैसा कि दूसरों ने सुझाव दिया है, अस्पष्टता की ओर जाता है। अंततः डेवलपर समय सीपीयू समय की तुलना में अधिक महंगा है, इसलिए मैं बाद की कीमत पर पूर्व के लिए अनुकूलन करूंगा। यह कहा जा रहा है, इस मामले में अंतर नगण्य होने की संभावना है, लेकिन अगर मुझे यकीन नहीं है कि कुछ सभ्य जावास्क्रिप्ट कंप्रेशर्स हैं जो इस तरह की चीज का अनुकूलन करेंगे।

इसलिए, उपरोक्त कारणों से मैं साथ जाऊंगा: n.toString()या String(n)String(n)शायद एक बेहतर विकल्प है क्योंकि अगर nयह अशक्त या अपरिभाषित है तो यह विफल नहीं होगा ।


12
सवाल संख्याओं को परिवर्तित करने के बारे में था, संख्याओं को परिवर्तित करने के बारे में नहीं null, या undefined। अगर nहै nullया undefinedमेरे प्रोग्राम में बग के कारण है, तो मैं अपने कार्यक्रम इस राज्य में विफल, मुझे खोजने और बग फिक्सिंग का एक बेहतर मौका देने के लिए पसंद करेंगे। प्रोग्राम क्रैश प्रोग्रामर को उपहार देने के लिए, उसे कीड़े खोजने में मदद करने के लिए :-)। विकल्प ऐसे सॉफ़्टवेयर को वितरित करना है जो डिज़ाइन के अनुसार काम नहीं करता है, बग पर सावधानीपूर्वक चमकते हुए। तो, मैं String(n)एक त्रुटि को मास्क करने के लिए उपयोग करने का प्रशंसक नहीं हूं ।
मैट वालिस

1
String(n)एक कार्यात्मक शैली में उपयोग करने के लिए अच्छा है, जैसे अंडरस्कोर के संयोजन के साथ _.compose(funcThatNeedsAStringParam, String)
रिक मार्टिंस

2
स्ट्रिंग (नल) प्रोजेगम को क्रैश नहीं करेगा, लेकिन यह शाब्दिक स्ट्रिंग "नल" को लौटा देगा, जो कि शायद आप नहीं चाहते हैं। यदि डेटा वैध रूप से शून्य हो सकता है, तो आपको इसे स्पष्ट रूप से संभालने की आवश्यकता है।
पीटर स्मार्ट्ट

1
@MattWallis मुझे लगता है कि डेवलपर का निर्णय होना चाहिए, न कि उत्तर देने वाला, क्या आपको नहीं लगता?
फॉरेस्टोपकिंसका

30

... जावास्क्रिप्ट के पार्सर एक बिंदु पर एक अस्थायी बिंदु शाब्दिक के रूप में डॉट नोटेशन पार्स करने की कोशिश करता है।

2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first

स्रोत


17

स्पष्ट रूप से जीभ में गाल:

var harshNum = 108;
"".split.call(harshNum,"").join("");

या ES6 में आप बस टेम्पलेट स्ट्रिंग्स का उपयोग कर सकते हैं :

var harshNum = 108;
`${harshNum}`;

यदि मैं ईएस 6 टेम्प्लेट के साथ बेंचमार्क चलाता हूं, तो यह कभी-कभी '' + numberविधि से भी तेज साबित होता है । इसने कहा, इन बेंचमार्क के परिणाम कई बार प्रदर्शन करते समय भिन्न होते हैं, इसलिए सुनिश्चित नहीं हैं कि उन्हें बहुत गंभीर रूप से लिया जाना चाहिए।
निको वान बेले

15

अन्य उत्तर पहले से ही अन्य विकल्पों को कवर करते हैं, लेकिन मैं इसे पसंद करता हूं:

s = `${n}`

लघु, रसीला, पहले से ही कई अन्य स्थानों में उपयोग किया जाता है (यदि आप एक आधुनिक ढांचे / ES संस्करण का उपयोग कर रहे हैं) तो यह एक सुरक्षित शर्त है जिसे कोई भी प्रोग्रामर समझ जाएगा।

ऐसा नहीं है कि यह (आमतौर पर) बहुत मायने रखता है, लेकिन यह अन्य तरीकों की तुलना में सबसे तेज भी है ।


यह भी सुरक्षित है अगर n एक संख्या नहीं हो सकती है।
david.pfx

लेकिन ऐसा है n.toString(), है ना?
19

1
@ यदि यह nहै तो undefinedइसका उपयोग करके एक वाक्यविन्यास त्रुटि को फेंक दिया जाएगा.toString()
जी मोक

क्या यह सिर्फ String(n)सभी मामलों में वैसा ही परिणाम नहीं देता है ? अंतर केवल इतना है कि यह कम स्पष्ट है।
बेनेट मैकलेवे ने

और बहुत धीमी।
एड्रियन बार्थोलोम्यू

12

किसी भी वैरिएबल को स्ट्रिंग में बदलने का सबसे सरल तरीका उस वेरिएबल में एक खाली स्ट्रिंग जोड़ना है।

5.41 + ''    // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'

2
ध्यान दें कि यह अंदर के अंदर होना चाहिए: (5.41 + '')स्ट्रिंग के तरीकों .substring()और अन्य का उपयोग करने के लिए
Gjaa

क्यों ध्यान दिया जाना चाहिए?
एड्रियन बार्थोलोम्यू

7

यदि आपको परिणाम को दशमलव स्थानों की एक विशिष्ट संख्या के लिए प्रारूपित करने की आवश्यकता है , उदाहरण के लिए मुद्रा का प्रतिनिधित्व करने के लिए, आपको toFixed()विधि की तरह कुछ चाहिए ।

number.toFixed( [digits] )

digits दशमलव स्थान के बाद प्रदर्शित करने के लिए अंकों की संख्या है।


2
जब तक आप जानते हैं कि यह एक संख्या नहीं है, असुरक्षित है ।
david.pfx

6

मैंने निम्न मामलों के लिए एक टेस्ट केस बनाने के लिए https://jsperf.com का उपयोग किया :

number + ''
`${number}`
String(number)
number.toString()

https://jsperf.com/number-string-conversion-speed-comparison

24 जुलाई, 2018 तक, परिणाम कहते हैं कि number + ''फ़ायरफ़ॉक्स में क्रोम में सबसे तेज़ है, जो टेम्पलेट स्ट्रिंग शाब्दिकों के साथ संबंध रखता है।

दोनों String(number), और number.toString()सबसे तेज़ विकल्प की तुलना में लगभग 95% धीमी हैं।

प्रदर्शन परीक्षण, ऊपर विवरण


2

मुझे पहले दो पसंद हैं क्योंकि उन्हें पढ़ना आसान है। मैं उपयोग करना चाहता हूं String(n)लेकिन यह किसी भी चीज की तुलना में सिर्फ स्टाइल की बात है।

जब तक आप के रूप में एक पंक्ति है

var n = 5;
console.log ("the number is: " + n);

जो बहुत ही आत्म व्याख्यात्मक है


2

मुझे लगता है कि यह स्थिति पर निर्भर करता है, लेकिन वैसे भी आप .toString()विधि का उपयोग कर सकते हैं क्योंकि यह समझना बहुत स्पष्ट है।


2

.toString () बिल्ट-इन टाइपकास्टिंग फंक्शन है, मैं उस विवरण का कोई विशेषज्ञ नहीं हूं, लेकिन जब भी हम बिल्ट-इन टाइप कास्टिंग स्पष्ट कार्यप्रणाली की तुलना करते हैं, तो अंतर्निहित वर्कअराउंड हमेशा पसंद किए जाते हैं।


1

अगर मुझे सब कुछ ध्यान में रखना है, तो मैं निम्नलिखित सुझाव दूंगा

var myint = 1;
var mystring = myint + '';
/*or int to string*/
myint = myint + ''

IMHO, स्ट्रिंग में परिवर्तित करने का सबसे तेज़ तरीका है। अगर मैं ग़लत हूं तो मेरी गलती सुझाएं।


1

लगभग सभी संभव मौजूदा और भविष्य के मामलों के लिए एकमात्र वैध समाधान (इनपुट संख्या, शून्य, अपरिभाषित, प्रतीक, कुछ और) है String(x)। सरल ऑपरेशन के लिए 3 तरीकों का उपयोग न करें, मूल्य प्रकार मान्यताओं पर आधारित, जैसे "यहां मैं निश्चित रूप से संख्या को स्ट्रिंग में परिवर्तित करता हूं और यहां निश्चित रूप से बूलियन टू स्ट्रिंग"।

स्पष्टीकरण:

String(x)अशक्त, अपरिभाषित, प्रतीकों, [कुछ भी] को संभालता है और .toString()वस्तुओं के लिए कहता है।

'' + x.valueOf()एक्स पर कॉल (संख्या के लिए कास्टिंग), प्रतीकों पर फेंकता है, कार्यान्वयन पर निर्भर परिणाम प्रदान कर सकता है।

x.toString() अशक्त और अपरिभाषित पर फेंकता है।

नोट: String(x)जैसे प्रोटोटाइप-कम ऑब्जेक्ट्स पर अभी भी विफल हो जाएगा Object.create(null)

यदि आप 'हैलो, अपरिभाषित' जैसे तार पसंद नहीं करते हैं या प्रोटोटाइप-कम ऑब्जेक्ट का समर्थन करना चाहते हैं, तो निम्न प्रकार रूपांतरण फ़ंक्शन का उपयोग करें:

/**
 * Safely casts any value to string. Null and undefined are converted to ''.
 * @param  {*} value
 * @return {string}
 */
function string (str) {
  return value == null ? '' : (typeof value === 'object' && !value.toString ? '[object]' : String(value));
}

1

नंबर शाब्दिक के साथ, संपत्ति तक पहुंचने के लिए डॉट को दशमलव डॉट से अलग किया जाना चाहिए। यह आपको निम्नलिखित विकल्पों के साथ छोड़ता है यदि आप संख्या १२: पर स्ट्रिंग () के लिए आमंत्रित करना चाहते हैं:

123..toString()
123 .toString() // space before the dot 123.0.toString()
(123).toString()

1

नीचे JS में स्ट्रिंगर को Integer में बदलने के तरीके दिए गए हैं

तरीकों को प्रदर्शन के घटते क्रम में व्यवस्थित किया जाता है।

(प्रदर्शन परीक्षण के परिणाम उनके उत्तर में @DarckBlezzer द्वारा दिए गए हैं)

var संख्या = 1

विधि 1:

संख्या = `$ {संख्या}`

विधि 2:

संख्या = संख्या + ''

विधि 3:

संख्या = स्ट्रिंग (संख्या)

विधि 4:

num = num.toString ()

ध्यान दें : आप सीधे नंबर से tostring () कॉल नहीं कर सकते

जैसे: 2.toString () बिना सिलेक्ट किए सिंटेक्स को फेंक देगा : अमान्य या अप्रत्याशित टोकन


0

यदि आप इस बात से उत्सुक हैं कि सबसे अधिक प्रदर्शन करने वाला व्यक्ति यह जाँच करता है कि मैं सभी भिन्न संख्याओं की तुलना कहाँ करता हूँ -> स्ट्रिंग रूपांतरण।

लगता है 2+''या 2+""सबसे तेज हैं।

https://jsperf.com/int-2-string


0

हम स्ट्रिंग कंस्ट्रक्टर का भी उपयोग कर सकते हैं । इस बेंचमार्क के अनुसार यह फ़ायरफ़ॉक्स 58 में नंबर को स्ट्रिंग में बदलने का सबसे तेज़ तरीका है, भले ही यह " + numलोकप्रिय ब्राउज़र Google क्रोम की तुलना में धीमा है ।



0

आप Numberऑब्जेक्ट को कॉल कर सकते हैं और फिर कॉल कर सकते हैं toString()

Number.call(null, n).toString()

आप इस ट्रिक का उपयोग दूसरी जावास्क्रिप्ट देशी वस्तुओं के लिए कर सकते हैं।


0

हाल ही में इस पर आएँ, विधि 3 और 4 उपयुक्त नहीं हैं क्योंकि तार की प्रतिलिपि कैसे बनाई जाती है और फिर एक साथ रखी जाती है। एक छोटे से कार्यक्रम के लिए यह समस्या नगण्य है, लेकिन किसी भी वास्तविक वेब एप्लिकेशन के लिए यह क्रिया जहां हमें आवृत्ति स्ट्रिंग जोड़तोड़ से निपटना पड़ता है, प्रदर्शन और पठनीयता को प्रभावित कर सकता है।

यहाँ लिंक पढ़ा है


0

मैं इसे और अधिक डेटा के साथ फिर से संपादित करने जा रहा हूं जब मेरे पास समय है, अभी के लिए यह ठीक है ...

नोड्ज में टेस्ट v8.11.2: 2018/06/06

let i=0;
    console.time("test1")
    for(;i<10000000;i=i+1){
    	const string = "" + 1234;
    }
    console.timeEnd("test1")
    
    i=0;
    console.time("test1.1")
    for(;i<10000000;i=i+1){
    	const string = '' + 1234;
    }
    console.timeEnd("test1.1")
    
    i=0;
    console.time("test1.2")
    for(;i<10000000;i=i+1){
    	const string = `` + 1234;
    }
    console.timeEnd("test1.2")
    
    i=0;
    console.time("test1.3")
    for(;i<10000000;i=i+1){
    	const string = 1234 +  '';
    }
    console.timeEnd("test1.3")
    
    
    i=0;
    console.time("test2")
    for(;i<10000000;i=i+1){
    	const string = (1234).toString();
    }
    console.timeEnd("test2")
    
    
    i=0;
    console.time("test3")
    for(;i<10000000;i=i+1){
    	const string = String(1234);
    }
    console.timeEnd("test3")
    
    
    i=0;
    console.time("test4")
    for(;i<10000000;i=i+1){
    	const string = `${1234}`;
    }
    console.timeEnd("test4")
    
    i=0;
    console.time("test5")
    for(;i<10000000;i=i+1){
    	const string = 1234..toString();
    }
    console.timeEnd("test5")
    
    i=0;
    console.time("test6")
    for(;i<10000000;i=i+1){
    	const string = 1234 .toString();
    }
    console.timeEnd("test6")

उत्पादन

test1: 72.268ms
test1.1: 61.086ms
test1.2: 66.854ms
test1.3: 63.698ms
test2: 207.912ms
test3: 81.987ms
test4: 59.752ms
test5: 213.136ms
test6: 204.869ms

Yay - test4 जो मैं नियमित रूप से उपयोग करता हूँ !!
एड्रियन बार्थोलोम्यू

0

यह नोड.जेएस का उपयोग करते समय समान परिणाम लगता है मैंने यह स्क्रिप्ट चलाई:

let bar;
let foo = ["45","foo"];

console.time('string concat testing');
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo;
}
console.timeEnd('string concat testing');


console.time("string obj testing");
for (let i = 0; i < 10000000; i++) {
    bar = String(foo);
}
console.timeEnd("string obj testing");

console.time("string both");
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo + "";
}
console.timeEnd("string both");

और निम्नलिखित परिणाम मिले:

 node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms

हर बार इसी तरह मैंने इसे चलाया।

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