मुझे कुछ कोड प्रोजेक्ट समाधान दिखाई देते हैं ।
लेकिन क्या जावास्क्रिप्ट में एक नियमित कार्यान्वयन है?
मुझे कुछ कोड प्रोजेक्ट समाधान दिखाई देते हैं ।
लेकिन क्या जावास्क्रिप्ट में एक नियमित कार्यान्वयन है?
जवाबों:
यदि आपको इंटरनेट एक्सप्लोरर के लिए कोड लिखना है तो सुनिश्चित करें कि आपने एक कार्यान्वयन चुना है, जो सरणी जोड़ का उपयोग करता है। IE पर ऑपरेटर +
या +=
ऑपरेटर के साथ संबंधित स्ट्रिंग्स बेहद धीमी हैं। यह विशेष रूप से IE6 के लिए सच है। आधुनिक ब्राउज़रों +=
पर आमतौर पर सरणी के रूप में उपवास के रूप में तेजी से होता है।
जब मुझे बहुत सारे स्ट्रिंग कॉन्सेप्टन करने होते हैं तो मैं आमतौर पर एक एरे को भरता हूं और स्ट्रिंग बिल्डर क्लास का उपयोग नहीं करता हूं:
var html = [];
html.push(
"<html>",
"<body>",
"bla bla bla",
"</body>",
"</html>"
);
return html.join("");
ध्यान दें कि push
विधियाँ कई तर्कों को स्वीकार करती हैं।
[foo(), "bar", "baz"].join("");
काम भी करते हैं।
push
कई तर्क स्वीकार कर सकते हैं। यादृच्छिक चीजें आप सीखते हैं।
मैंने सिर्फ http://jsperf.com/javascript-concat-vs-join/2 पर प्रदर्शन रीचेक किया । परीक्षण-मामले १००० बार वर्णमाला को मिलाते हैं या जुड़ते हैं।
वर्तमान ब्राउज़रों (एफएफ, ओपेरा, आईई 11, क्रोम) में, "कॉनकट" "जॉइन" की तुलना में लगभग 4-10 गुना तेज है।
IE8 में, दोनों समान परिणामों के बारे में लौटते हैं।
IE7 में, "जॉइन" दुर्भाग्य से लगभग 100 गुना तेज है।
नहीं, इमारत के तारों के लिए कोई अंतर्निहित समर्थन नहीं है। आपको इसके बजाय कॉनटेनटेशन का उपयोग करना होगा।
आप, निश्चित रूप से, अपने स्ट्रिंग के विभिन्न हिस्सों की एक सरणी बना सकते हैं और फिर join()
उस सरणी पर कॉल कर सकते हैं, लेकिन यह तब निर्भर करता है कि आपके द्वारा उपयोग किए जा रहे जावास्क्रिप्ट दुभाषिया में सम्मिलित कैसे लागू किया जाए।
मैंने str1+str2
विधि बनाम array.push(str1, str2).join()
विधि की गति की तुलना करने के लिए एक प्रयोग किया । कोड सरल था:
var iIterations =800000;
var d1 = (new Date()).valueOf();
str1 = "";
for (var i = 0; i<iIterations; i++)
str1 = str1 + Math.random().toString();
var d2 = (new Date()).valueOf();
log("Time (strings): " + (d2-d1));
var d3 = (new Date()).valueOf();
arr1 = [];
for (var i = 0; i<iIterations; i++)
arr1.push(Math.random().toString());
var str2 = arr1.join("");
var d4 = (new Date()).valueOf();
log("Time (arrays): " + (d4-d3));
मैंने इसे इंटरनेट एक्सप्लोरर 8 और फ़ायरफ़ॉक्स 3.5.5 में, विंडोज 7 एक्स 64 पर दोनों का परीक्षण किया।
शुरुआत में मैंने छोटी संख्या में पुनरावृत्तियों (कुछ सौ, कुछ हजार आइटम) पर परीक्षण किया। परिणाम अप्रत्याशित थे (कभी-कभी स्ट्रिंग संघनन में 0 मिलीसेकंड लिया जाता था, कभी-कभी इसमें 16 मिली सेकेंड लगते थे, वही सरणी में शामिल होने के लिए)।
जब मैंने गिनती को 50,000 तक बढ़ा दिया, तो परिणाम अलग-अलग ब्राउज़रों में अलग-अलग थे - इंटरनेट एक्सप्लोरर में स्ट्रिंग का संघनन तेज (94 मिलीसेकंड) था और इसमें शामिल होने की गति धीमी (125 मिलीसेकंड) थी, जबकि फ़ायरफ़ॉक्स में सरणी जुड़ाव तेज़ (113 मिलीसेकंड) से अधिक था स्ट्रिंग जॉइनिंग (117 मिलीसेकंड)।
फिर मैंने गिनती बढ़ाकर 500'000 कर दी। अब दोनों ब्राउजरों में स्ट्रिंग कॉन्टेनेटेशन की तुलनाarray.join()
में धीमी थी : इंटरनेट एक्सप्लोरर में स्ट्रिंग कॉनटेनेंस 937 एमएस था, फायरफॉक्स में 1155 एमएस, इंटरनेट एक्सप्लोरर में सरणी 1265 और फायरफॉक्स में 1207 एमएस शामिल है।
"स्क्रिप्ट को निष्पादित करने में बहुत लंबा समय लग रहा है" होने के बिना मैं इंटरनेट एक्सप्लोरर में अधिकतम पुनरावृत्ति गणना कर सकता था, 850,000 थी। तब इंटरनेट एक्सप्लोरर स्ट्रिंग कॉन्सेप्टन के लिए 1593 और एरे जॉइन के लिए 2046 था, और फ़ायरफ़ॉक्स में स्ट्रिंग कॉन्क्वेनेशन के लिए 2101 और एरे जॉइन के लिए 2249 था।
परिणाम - यदि पुनरावृत्तियों की संख्या छोटी है, तो आप उपयोग करने का प्रयास कर सकते हैं array.join()
, क्योंकि यह फ़ायरफ़ॉक्स में तेज़ हो सकता है। जब संख्या बढ़ती है, तो string1+string2
विधि तेज होती है।
मैंने इंटरनेट एक्सप्लोरर 6 (विंडोज एक्सपी) पर परीक्षण किया। यदि मैंने 100,000 से अधिक पुनरावृत्तियों पर परीक्षण की कोशिश की, तो प्रक्रिया तुरंत जवाब देने के लिए बंद हो गई और कभी समाप्त नहीं हुई। 40,000 पुनरावृत्तियों पर परिणाम थे
Time (strings): 59175 ms
Time (arrays): 220 ms
इसका मतलब है - यदि आपको इंटरनेट एक्सप्लोरर 6 का समर्थन करने की आवश्यकता है, तो चुनें array.join()
कि स्ट्रिंग संधि की तुलना में कौन सा तेज़ है।
join()
ECMAScript का हिस्सा है और प्रत्येक जावास्क्रिप्ट दुभाषिया इसे लागू करता है। यह "निर्भर" क्यों होगा?
यह कोड उस मार्ग की तरह दिखता है जिसे आप कुछ बदलावों के साथ लेना चाहते हैं।
आप इस तरह दिखने के लिए परिशिष्ट विधि बदलना चाहते हैं। मैंने इसे 0 नंबर स्वीकार करने के लिए बदल दिया है, और इसे वापस करने के लिए this
ताकि आप अपने ऐप्पल को चेन कर सकें।
StringBuilder.prototype.append = function (value) {
if (value || value === 0) {
this.strings.push(value);
}
return this;
}
null
, false
, रिक्त स्ट्रिंग, undefined
या NaN
।
जावास्क्रिप्ट के ECMAScript 6 संस्करण (उर्फ ECMAScript 2015) ने स्ट्रिंग शाब्दिक शुरुआत की ।
var classType = "stringbuilder";
var q = `Does JavaScript have a built-in ${classType} class?`;
ध्यान दें कि सिंगल-कोट्स के बजाय, बैक-टिक्स, स्ट्रिंग को संलग्न करते हैं।
C # में आप कुछ ऐसा कर सकते हैं
String.Format("hello {0}, your age is {1}.", "John", 29)
जावास्क्रिप्ट में आप कुछ ऐसा कर सकते हैं
var x = "hello {0}, your age is {1}";
x = x.replace(/\{0\}/g, "John");
x = x.replace(/\{1\}/g, 29);
{0}
प्रतिस्थापित किया गया है {1}
।
रुचि रखने वालों के लिए, यहाँ Array.join को लागू करने का एक विकल्प है:
var arrayOfStrings = ['foo', 'bar'];
var result = String.concat.apply(null, arrayOfStrings);
console.log(result);
आउटपुट, जैसा कि अपेक्षित था, स्ट्रिंग 'फोब्बर' है। फ़ायरफ़ॉक्स में, यह दृष्टिकोण Array.join से आगे निकल जाता है, लेकिन outatformed + concatenation द्वारा होता है। चूंकि String.concat को प्रत्येक खंड को एक अलग तर्क के रूप में निर्दिष्ट करने की आवश्यकता होती है, इसलिए कॉल करने वाला जावास्क्रिप्ट इंजन द्वारा निष्पादित किसी भी तर्क गणना सीमा द्वारा सीमित होता है। अधिक जानकारी के लिए Function.prototype.apply () के प्रलेखन पर एक नज़र डालें ।
मैंने इस फ़ंक्शन को परिभाषित किया है:
function format() {
var args = arguments;
if (args.length <= 1) {
return args;
}
var result = args[0];
for (var i = 1; i < args.length; i++) {
result = result.replace(new RegExp("\\{" + (i - 1) + "\\}", "g"), args[i]);
}
return result;
}
और सी # की तरह बुलाया जा सकता है:
var text = format("hello {0}, your age is {1}.", "John", 29);
परिणाम:
हैलो जॉन, आपकी उम्र 29 है।
जब मैं अपने आप को जावास्क्रिप्ट में बहुत सारे स्ट्रिंग संयोजन का काम करता हुआ पाता हूं, तो मैं टेंपलेटिंग की तलाश शुरू करता हूं। HTML और JavaScript को अधिक पठनीय रखने के लिए Handlebars.js काफी अच्छी तरह से काम करता है। http://handlebarsjs.com
कैसे के बारे sys.StringBuilder()
में निम्नलिखित लेख की कोशिश करो।