ฉันเห็นโซลูชันโครงการรหัสสองสามข้อ
แต่มีการใช้งานปกติใน JavaScript?
ฉันเห็นโซลูชันโครงการรหัสสองสามข้อ
แต่มีการใช้งานปกติใน JavaScript?
คำตอบ:
หากคุณต้องเขียนรหัสสำหรับ Internet Explorer ตรวจสอบให้แน่ใจว่าคุณเลือกการใช้งานซึ่งใช้การรวมอาเรย์ Concatenating สตริงกับ+
หรือ+=
ผู้ประกอบการจะช้ามากใน IE นี่เป็นเรื่องจริงโดยเฉพาะอย่างยิ่งสำหรับ IE6 ในเบราว์เซอร์สมัยใหม่+=
มักจะเร็วพอ ๆ กับการรวมอาเรย์
เมื่อฉันต้องทำ string concatenations มากมายฉันมักจะเติม array และไม่ใช้ class builder string:
var html = [];
html.push(
"<html>",
"<body>",
"bla bla bla",
"</body>",
"</html>"
);
return html.join("");
โปรดทราบว่าpush
วิธีการรับหลายอาร์กิวเมนต์
[foo(), "bar", "baz"].join("");
งานได้เช่นกัน
push
สามารถยอมรับข้อโต้แย้งหลาย ๆ ข้อได้ สิ่งสุ่มที่คุณเรียนรู้
ฉันเพียงแค่ rechecked ประสิทธิภาพบนhttp://jsperf.com/javascript-concat-vs-join/2 กรณีทดสอบต่อกันหรือรวมตัวอักษร 1,000 ครั้ง
ในเบราว์เซอร์ปัจจุบัน (FF, Opera, IE11, Chrome), "concat" เร็วกว่า "เข้าร่วม" ประมาณ 4-10 เท่า
ใน IE8 ทั้งคู่จะให้ผลลัพธ์เท่ากัน
ใน IE7 "เข้าร่วม" เร็วขึ้นประมาณ 100 เท่าน่าเสียดาย
ไม่ไม่มีการรองรับการสร้างสตริงในตัว คุณต้องใช้การต่อข้อมูลแทน
แน่นอนว่าคุณสามารถสร้างอาเรย์ของส่วนต่าง ๆ ของสตริงและเรียกjoin()
ใช้อาเรย์นั้นได้ แต่มันก็ขึ้นอยู่กับวิธีการนำการเข้าร่วมมาใช้ในล่าม JavaScript ที่คุณใช้
ฉันทำการทดลองเพื่อเปรียบเทียบความเร็วของ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));
ฉันทดสอบใน Internet Explorer 8 และ Firefox 3.5.5 ทั้งบน Windows 7 x64
ในตอนแรกฉันทำการทดสอบซ้ำจำนวนเล็กน้อย (บางแสนหลายพันรายการ) ผลลัพธ์ไม่สามารถคาดการณ์ได้ (บางครั้งการต่อข้อมูลสตริงใช้เวลา 0 มิลลิวินาทีบางครั้งใช้เวลา 16 มิลลิวินาทีซึ่งเหมือนกันสำหรับการเข้าร่วมอาร์เรย์)
เมื่อฉันเพิ่มจำนวนเป็น 50,000 ผลลัพธ์จะแตกต่างกันไปในเบราว์เซอร์ที่ต่างกัน - ใน Internet Explorer การต่อสตริงจะเร็วกว่า (94 มิลลิวินาที) และการเข้าร่วมช้ากว่า (125 มิลลิวินาที) ใน Firefox การเข้าร่วมอาร์เรย์เร็วกว่า (113 มิลลิวินาที) การรวมสตริง (117 มิลลิวินาที)
จากนั้นฉันเพิ่มจำนวนเป็น 500'000 ตอนนี้array.join()
ก็ช้ากว่าสตริงในเบราว์เซอร์ทั้งสอง: สตริงเป็น 937 มิลลิวินาทีใน Internet Explorer 1155 มิลลิวินาทีใน Firefox อาร์เรย์เข้าร่วม 1265 ใน Internet Explorer และ 1,207 มิลลิวินาทีใน Firefox
จำนวนการวนซ้ำสูงสุดที่ฉันสามารถทดสอบได้ใน Internet Explorer โดยไม่ต้อง "สคริปต์ใช้เวลาในการเรียกใช้นานเกินไป" คือ 850,000 จากนั้น Internet Explorer คือ 1593 สำหรับการต่อสตริงและ 2046 สำหรับการรวมอาเรย์และ Firefox มี 2101 สำหรับการต่อสตริงและ 2249 สำหรับการรวมอาเรย์
ผลลัพธ์ - หากจำนวนการทำซ้ำมีน้อยคุณสามารถลองใช้array.join()
เพราะอาจทำให้เร็วขึ้นใน Firefox เมื่อจำนวนเพิ่มขึ้นstring1+string2
วิธีการจะเร็วขึ้น
ฉันทำการทดสอบบน Internet Explorer 6 (Windows XP) กระบวนการหยุดตอบสนองทันทีและไม่สิ้นสุดถ้าฉันลองทดสอบมากกว่า 100,000 ครั้ง ในการทำซ้ำ 40,000 ครั้งผลลัพธ์คือ
Time (strings): 59175 ms
Time (arrays): 220 ms
ซึ่งหมายความว่า - หากคุณต้องการรองรับ Internet Explorer 6 ให้เลือกarray.join()
วิธีที่เร็วกว่าการต่อสตริง
join()
เป็นส่วนหนึ่งของ ECMAScript และ afaik ล่าม JavaScript ทุกตัวใช้งานมัน ทำไม "ขึ้นอยู่กับ"?
รหัสนั้นดูเหมือนว่าเส้นทางที่คุณต้องการด้วยการเปลี่ยนแปลงเล็กน้อย
คุณจะต้องการเปลี่ยนวิธีการผนวกให้มีลักษณะเช่นนี้ ฉันได้เปลี่ยนมันเพื่อรับหมายเลข 0 และทำให้มันกลับมาthis
เพื่อให้คุณสามารถเชื่อมโยงต่อท้าย
StringBuilder.prototype.append = function (value) {
if (value || value === 0) {
this.strings.push(value);
}
return this;
}
null
, false
สตริงว่างเปล่าหรือundefined
NaN
ECMAScript 6 รุ่น (aka ECMAScript 2015) ของ JavaScript แนะนำตัวอักษรของสตริง
var classType = "stringbuilder";
var q = `Does JavaScript have a built-in ${classType} class?`;
ขอให้สังเกตว่าย้อนกลับ - ติ๊กแทนคำพูดเดียวล้อมรอบสตริง
ใน C # คุณสามารถทำสิ่งที่ชอบ
String.Format("hello {0}, your age is {1}.", "John", 29)
ใน JavaScript คุณสามารถทำสิ่งที่ชอบ
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);
ผลลัพธ์ตามที่คาดไว้คือสตริง 'foobar' ใน Firefox วิธีนี้มีประสิทธิภาพสูงกว่า Array.join แต่มีประสิทธิภาพดีกว่าด้วย + การต่อข้อมูล เนื่องจาก String.concat ต้องการให้แต่ละเซ็กเมนต์ต้องระบุเป็นอาร์กิวเมนต์แยกผู้โทรจะถูก จำกัด ด้วยข้อ จำกัด การนับจำนวนอาร์กิวเมนต์ใด ๆ ที่กำหนดโดยเอ็นจินการเรียกใช้ JavaScript ลองดูที่เอกสารของ 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;
}
และสามารถเรียกเช่น c #:
var text = format("hello {0}, your age is {1}.", "John", 29);
ผลลัพธ์:
สวัสดีจอห์นอายุของคุณคือ 29
เมื่อฉันพบว่าตัวเองกำลังทำการเรียงต่อสตริงจำนวนมากใน JavaScript ฉันเริ่มมองหาเทมเพลต Handlebars.js ทำงานค่อนข้างดีทำให้ HTML และ JavaScript อ่านง่ายขึ้น http://handlebarsjs.com
sys.StringBuilder()
ลองเกี่ยวกับบทความต่อไปนี้