เมื่อเร็ว ๆ นี้ในการศึกษา "JavaScript Advanced Programming" มีคำอธิบายเกี่ยวกับลักษณะของสตริง ข้อความต้นฉบับมีดังนี้: สตริงใน ecmascript นั้นไม่เปลี่ยนรูปนั่นคือเมื่อสร้างสตริงค่าของพวกเขาจะไม่สามารถเปลี่ยนแปลงได้ หากต้องการเปลี่ยนสตริงที่บันทึกไว้ของตัวแปรก่อนอื่นทำลายสตริงต้นฉบับจากนั้นเติมตัวแปรด้วยสตริงอื่นที่มีค่าใหม่เช่น:
การคัดลอกรหัสมีดังนี้:
var lang = "java";
lang = lang + "สคริปต์";
กระบวนการของการใช้งานการดำเนินการนี้มีดังนี้: ก่อนสร้างสตริงใหม่ที่สามารถเก็บ 10 อักขระได้แล้วเติมด้วย "Java" และ "สคริปต์" ในสตริงนี้ ขั้นตอนสุดท้ายคือการทำลายสตริงดั้งเดิม "Java" และ "สคริปต์" เพราะทั้งสองสายนี้ไร้ประโยชน์ อย่างไรก็ตามในเบราว์เซอร์รุ่นที่ต่ำกว่า (เช่น IE6) ความเร็วในการประกบของสตริงเป็นกระบวนการที่ใช้เวลานาน
จากนี้ฉันคิดถึง Java กลไกสตริงใน Java นั้นคล้ายกับ JS (นั่นคือมันไม่สามารถเปลี่ยนแปลงได้หลังจากการสร้างและการเปลี่ยนแปลงมันสามารถทำลายค่าดั้งเดิมเท่านั้น) แต่ Java มีสตริงบัฟฟ์ที่แก้ปัญหาของสตริงที่ไม่เปลี่ยนแปลงและ JS ไม่มีวิธีที่คล้ายกัน แต่เราสามารถจำลองกลไกบัฟเฟอร์นี้ได้ หลักการคือการใช้อาร์เรย์สำหรับการประกบซอร์สโค้ดมีดังนี้:
การคัดลอกรหัสมีดังนี้:
ฟังก์ชัน StringBuffer () {
นี้ .__ Strings__ = new Array ();
-
StringBuffer.prototype.append = function (str) {
สตริง. __. push (str);
คืนสิ่งนี้; // การทำงานของห่วงโซ่ที่สะดวกสบาย
-
stringbuffer.prototype.toString = function () {
ส่งคืนสตริง. __ __. เข้าร่วม ("");
-
/*ทดสอบ*/
var buffer = new StringBuffer ();
buffer.append ("สวัสดี") ผนวก ("JavaScript");
var result = buffer.toString ();
การแจ้งเตือน (ผลลัพธ์);
PS: ที่อยู่ GIST มีดังนี้: https://gist.github.com/hehongwei44/fe71f10e4d2d9295Aeab
เราได้จำลองกลไก แต่มีความแตกต่างในประสิทธิภาพระหว่างวิธีนี้และการประกบสตริง เราสามารถทดสอบได้และรหัสทดสอบมีดังนี้:
การคัดลอกรหัสมีดังนี้:
var d1 = วันที่ใหม่ ();
var str = "";
สำหรับ (var i = 0; i <10,000; i ++) {
str += "ข้อความ";
-
var d2 = วันที่ใหม่ ();
document.write ("ทดสอบค่าใช้จ่ายหนึ่ง:" + (d2.getTime () - d1.getTime ())/1000 + "วินาที" + "<br/>");
var obuffer = new StringBuffer ();
d3 = วันที่ใหม่ ();
สำหรับ (var i = 0; i <10,000; i ++) {
obuffer.append ("ข้อความ");
-
var sresult = obuffer.toString ();
d4 = วันที่ใหม่ ();
document.write ("ทดสอบสองค่าใช้จ่าย:" + (d4.getTime () - d3.getTime ())/1000 + "วินาที");
ผลการทดสอบมีดังนี้ (ผลการทดสอบอาจแตกต่างกันในสภาพแวดล้อมที่แตกต่างกัน):
1. เมื่อเปรียบเทียบ 1,000 เท่าเป็นฐานการดำเนินการของทั้งสองนั้นเร็วมาก (มิลลิวินาทีพื้นฐาน) และใช้เวลาประมาณเดียวกัน ความแตกต่างหลังระหว่างอดีตจะไม่เกิน 10 มิลลิวินาที
2. ด้วย 10,000 เท่าเป็นฐานผลการดำเนินการจะคล้ายกับข้างต้น แต่อดีตมีค่าโทรศัพท์เพิ่มเติมภายใต้ IE6
3. ด้วย 100,000 เท่าในฐานะฐานการประกบสตริงใน IE6 เห็นได้ชัดว่าต้องใช้เวลามากขึ้นและเบราว์เซอร์อื่น ๆ ก็ไม่แตกต่างกันมากและบางตัวก็สั้นกว่า StringBuffer
สรุปแล้ว
1. เมื่อจำนวนคำประกบน้อยกว่า 1,000 ครั้งใช้อดีตอย่างกล้าหาญและเราไม่ค่อยพบกับการประกบหลายพันครั้ง
2. เบราว์เซอร์อื่น ๆ ไม่มีปัญหาด้านประสิทธิภาพกับการประกบส่วนใหญ่คือ IE6 หากการประกบเวลามีค่าใช้จ่ายนับหมื่นหรือหลายแสนครั้งขอแนะนำให้ใช้ StringBuffer เพื่อจำลอง IE6 เพียงอย่างเดียว