มีคำตอบมากมายที่นี่และทุกคำตอบมีสองวิธี:
- วิธีที่ 1: แบ่งสตริงโดยใช้สตริงย่อยสองรายการและใช้อักขระระหว่างกัน
- วิธีที่ 2: แปลงสตริงเป็นอาร์เรย์อักขระแทนที่สมาชิกอาเรย์หนึ่งตัวและเข้าร่วม
โดยส่วนตัวฉันจะใช้สองวิธีนี้ในกรณีที่แตกต่างกัน ให้ฉันอธิบาย
@ FabioPhms: วิธีการของคุณเป็นวิธีแรกที่ฉันใช้และฉันกลัวว่ามันจะไม่ดีในสายอักขระที่มีจำนวนมาก อย่างไรก็ตามคำถามคือตัวละครจำนวนมากคืออะไร? ฉันทดสอบในย่อหน้า 10 "lorem ipsum" และใช้เวลาไม่กี่มิลลิวินาที จากนั้นฉันทดสอบบนสตริงที่มีขนาดใหญ่กว่า 10 เท่า - มันไม่มีความแตกต่างกันมากนัก ฮึ่ม
@vsync, @Cory Mawhorter: ความคิดเห็นของคุณไม่น่าสงสัย อย่างไรก็ตามอีกครั้งสตริงขนาดใหญ่คืออะไร? ฉันยอมรับว่าสำหรับประสิทธิภาพ 32 ... 100kb ควรดีกว่าและควรใช้ substring-variant สำหรับการเปลี่ยนอักขระหนึ่งครั้ง
แต่จะเกิดอะไรขึ้นถ้าฉันต้องเปลี่ยนใหม่ไม่กี่ครั้ง?
ฉันต้องทำการทดสอบของตัวเองเพื่อพิสูจน์ว่าอะไรเร็วขึ้นในกรณีนั้น สมมติว่าเรามีอัลกอริทึมที่จะจัดการสตริงที่ค่อนข้างสั้นซึ่งประกอบด้วยอักขระ 1,000 ตัว เราคาดว่าโดยเฉลี่ยอักขระแต่ละตัวในสตริงนั้นจะถูกแทนที่ ~ 100 ครั้ง ดังนั้นรหัสเพื่อทดสอบสิ่งนี้คือ:
var str = "... {A LARGE STRING HERE} ...";
for(var i=0; i<100000; i++)
{
var n = '' + Math.floor(Math.random() * 10);
var p = Math.floor(Math.random() * 1000);
// replace character *n* on position *p*
}
ฉันสร้างไวโอลินสำหรับนี้และก็ที่นี่ มีการทดสอบสองแบบคือ TEST1 (สตริงย่อย) และ TEST2 (การแปลงอาร์เรย์)
ผล:
ดูเหมือนว่าการแปลงอาเรย์จะเต้นย่อยด้วย 2 ขนาดของคำสั่ง! ดังนั้น - เกิดอะไรขึ้นที่นี่ ???
สิ่งที่เกิดขึ้นจริงคือว่าการดำเนินการทั้งหมดใน TEST2 strarr2[p] = n
จะทำในอาร์เรย์ตัวเองโดยใช้การแสดงออกที่ได้รับมอบหมายเช่น การมอบหมายนั้นเร็วมากเมื่อเปรียบเทียบกับสตริงย่อยบนสตริงขนาดใหญ่และชัดเจนว่ามันจะชนะ
ดังนั้นมันคือทั้งหมดที่เกี่ยวกับการเลือกเครื่องมือที่เหมาะสมสำหรับงาน อีกครั้ง
str[0] = 'x'
ไม่ดูเหมือนจะโยนข้อผิดพลาด แต่ก็ไม่มีผลตามที่ต้องการ!