في الآونة الأخيرة ، في دراسة "البرمجة المتقدمة JavaScript" ، هناك وصف لخصائص السلاسل. النص الأصلي تقريبًا على النحو التالي: الأوتار في ECMAScript غير قابلة للتغيير ، أي بمجرد إنشاء الأوتار ، لا يمكن تغيير قيمها. لتغيير السلسلة المحفوظة للمتغير ، قم أولاً بتدمير السلسلة الأصلية ، ثم ملء المتغير بسلسلة أخرى تحتوي على القيمة الجديدة ، على سبيل المثال:
نسخة الكود كما يلي:
var lang = "java" ؛
lang = lang + "script" ؛
عملية تنفيذ هذه العملية هي كما يلي: أولاً قم بإنشاء سلسلة جديدة يمكنها عقد 10 أحرف ، ثم ملئها بـ "Java" و "Script" في هذه السلسلة. الخطوة الأخيرة هي تدمير الأوتار الأصلية "Java" و "Script" ، لأن هاتين السلاسلان عديمة الفائدة. ومع ذلك ، في الإصدارات المنخفضة من المتصفحات (مثل IE6) ، تعد سرعة الربط السلسلة عملية تستهلك الأداء.
من هذا أفكر في جافا. تشبه آلية السلسلة في Java JS (أي ، لا يمكن تغييرها بعد الإنشاء ، ولتغييرها يمكن أن تدمر القيمة الأصلية فقط) ، لكن Java لديها سلسلة متسلسلة تحل مشكلة عدم قابلية التسلسل للسلسلة ، وليس لدى JS طريقة مماثلة. ولكن يمكننا محاكاة آلية التخزين المؤقت هذه. المبدأ هو استخدام المصفوفات للربط ، رمز المصدر هو كما يلي:
نسخة الكود كما يلي:
وظيفة StringBuffer () {
هذا .__ strings__ = new array () ؛
}
stringbuffer.prototype.append = function (str) {
هذا .__ سلاسل __. دفع (str) ؛
إرجاع هذا ؛ // عملية سلسلة مريحة
}
stringbuffer.prototype.toString = function () {
إرجاع هذا. __ Strings __. انضم ("") ؛
}
/*امتحان*/
var buffer = new StringBuffer () ؛
Buffer.Append ("Hello"). إلحاق ("JavaScript") ؛
var result = buffer.toString () ؛
تنبيه (نتيجة) ؛
PS: عنوان GIST كما يلي: https://gist.github.com/hehongwei44/fe71f10e4d2d9295aeab
لقد قمنا بمحاكاة الآلية ، ولكن هناك اختلاف في الأداء بين هذه الطريقة وربط السلسلة. يمكننا اختباره ، ورمز الاختبار كما يلي:
نسخة الكود كما يلي:
var d1 = date new () ؛
var str = "" ؛
لـ (var i = 0 ؛ i <10000 ؛ i ++) {
str += "النص" ؛
}
var d2 = date new () ؛
document.write ("اختبار واحد التكلفة:" + (d2.getTime () - d1.getTime ())/1000 + "Seconds" + "<br/>") ؛
var obuffer = new StringBuffer () ؛
D3 = تاريخ جديد () ؛
لـ (var i = 0 ؛ i <10000 ؛ i ++) {
obuffer.append ("text") ؛
}
var sresult = obuffer.toString () ؛
D4 = تاريخ جديد () ؛
document.write ("اختبار تكاليف اثنين:" + (d4.getTime () - d3.getTime ())/1000 + "Seconds") ؛
نتائج الاختبار هي كما يلي: (قد تكون نتائج الاختبار مختلفة في بيئات مختلفة):
1. عند مقارنة 1000 مرة كقاعدة ، يكون تنفيذ كليهما سريعًا جدًا (ميلي ثانية أساسية) ويستغرق نفس الوقت تقريبًا. الفرق الأخير بين السابق لن يتجاوز 10 مللي ثانية.
2. مع 10000 مرة كقاعدة ، فإن نتيجة التنفيذ تشبه ما سبق ، ولكن السابق لديه المزيد من فواتير الهاتف تحت IE6.
3. مع 100000 مرة كقاعدة ، من الواضح أن الربط في IE6 يستغرق المزيد من الوقت ، ولا تختلف المتصفحات الأخرى كثيرًا ، وبعضها أقصر من StringBuffer.
ختاماً
1. عندما يكون عدد الكلمات الربط أقل من 1000 مرة ، نستخدم بجرأة الأولى ، ونادراً ما نواجه آلاف أوقات الربط.
2. المتصفحات الأخرى ليس لديها مشاكل في الأداء في الربط ، وخاصة IE6. إذا كانت أوقات الربط تكلف عشرات الآلاف أو المئات من الآلاف ، فمن المستحسن استخدام StringBuffer لمحاكاة IE6 وحده.