ดูเหมือนจะมีความสับสนมากมายซึ่งได้รับการกล่าวถึงเฉพาะในความคิดเห็นโดย elclanrs และ raina77ow ดังนั้นให้ฉันโพสต์คำตอบที่ชัดเจน
ชี้แจง
จาก " string.splice" เราอาจคาดหวังได้เช่นเดียวกับอาร์เรย์:
- ยอมรับได้ถึง 3 อาร์กิวเมนต์: ตำแหน่งเริ่มต้นความยาวและ (เป็นทางเลือก) การแทรก (สตริง)
- ส่งคืนส่วนที่ตัดออก
- แก้ไขสตริงเดิม
ปัญหาคือไม่สามารถตอบสนองความต้องการ 3d ได้เนื่องจากสตริงไม่เปลี่ยนรูป (เกี่ยวข้อง: 1 , 2 ) ฉันพบความคิดเห็นที่ทุ่มเทที่สุดที่นี่ :
ในสตริง JavaScript เป็นประเภทค่าดั้งเดิมไม่ใช่วัตถุ ( ข้อมูลจำเพาะ ) ในความเป็นจริงของ ES5 พวกเขาเป็นหนึ่งในเพียง 5 ประเภทค่าข้างnull, undefined, และnumber booleanStrings ได้รับมอบหมายจากค่าและไม่ได้โดยการอ้างอิงและจะถูกส่งผ่านดังกล่าว ดังนั้นสตริงไม่ได้เปลี่ยนรูปเพียงแค่พวกเขามีค่า การเปลี่ยนสาย"hello"ที่จะ"world"เป็นเหมือนการตัดสินใจว่าจากนี้ไปหมายเลข 3 เป็นจำนวน 4 ... มันทำให้รู้สึกไม่
ดังนั้นในบัญชีนี้เราอาจคาดหวังstring.spliceสิ่งที่ "" เท่านั้น:
- ยอมรับได้ถึง 2 อาร์กิวเมนต์: ตำแหน่งเริ่มต้น, ความยาว (การแทรกไม่สมเหตุสมผลเนื่องจากไม่มีการเปลี่ยนแปลงสตริง)
- ส่งคืนส่วนที่ตัดออก
ซึ่งคือสิ่งที่substrทำ; หรืออีกทางหนึ่งคือ
- ยอมรับได้ถึง 3 อาร์กิวเมนต์: ตำแหน่งเริ่มต้นความยาวและ (เป็นทางเลือก) การแทรก (สตริง)
- ส่งคืนสตริงที่แก้ไข (โดยไม่มีส่วนตัดและมีการแทรก)
ซึ่งเป็นเรื่องของส่วนถัดไป
แนวทางแก้ไข
หากคุณสนใจเกี่ยวกับการเพิ่มประสิทธิภาพคุณควรใช้การใช้งานของ Mike:
String.prototype.splice = function(index, count, add) {
if (index < 0) {
index += this.length;
if (index < 0)
index = 0;
}
return this.slice(0, index) + (add || "") + this.slice(index + count);
}
แม้ว่าการปฏิบัติต่อดัชนีนอกขอบเขตอาจแตกต่างกันไป ขึ้นอยู่กับความต้องการของคุณคุณอาจต้องการ:
if (index < 0) {
index += this.length;
if (index < 0)
index = 0;
}
if (index >= this.length) {
index -= this.length;
if (index >= this.length)
index = this.length - 1;
}
หรือแม้กระทั่ง
index = index % this.length;
if (index < 0)
index = this.length + index;
หากคุณไม่สนใจเรื่องประสิทธิภาพคุณอาจต้องการปรับเปลี่ยนคำแนะนำของ Kumar ซึ่งตรงไปตรงมามากกว่า:
String.prototype.splice = function(index, count, add) {
var chars = this.split('');
chars.splice(index, count, add);
return chars.join('');
}
ประสิทธิภาพ
ความแตกต่างในการแสดงจะเพิ่มขึ้นอย่างมากตามความยาวของสตริง jsperf แสดงให้เห็นว่าสำหรับสตริงที่มีความยาว 10 โซลูชันหลัง (การแยกและการรวม) จะช้ากว่าโซลูชันเดิมถึงสองเท่า (โดยใช้สไลซ์) สำหรับสตริง 100 ตัวอักษรคือ x5 และสำหรับสตริง 1,000 ตัวอักษรคือ x50 ใน Ops / วินาทีมัน:
10 letters 100 letters 1000 letters
slice implementation 1.25 M 2.00 M 1.91 M
split implementation 0.63 M 0.22 M 0.04 M
โปรดทราบว่าฉันได้เปลี่ยนอาร์กิวเมนต์ที่ 1 และ 2 เมื่อย้ายจาก 10 ตัวอักษรเป็น 100 ตัวอักษร (ฉันยังแปลกใจที่การทดสอบ 100 ตัวอักษรทำงานเร็วกว่า 10 ตัวอักษร)
str.splitอาจเป็นฟังก์ชันที่คุณกำลังมองหา: google.com/#q=javascript+string+split