Có vẻ như có rất nhiều sự nhầm lẫn chỉ được giải quyết trong các bình luận của elclanrs và raina77ow, vì vậy hãy để tôi đăng một câu trả lời làm rõ.
Làm rõ
Từ " string.splice" người ta có thể mong đợi rằng nó, giống như đối với mảng:
- chấp nhận tối đa 3 đối số: vị trí bắt đầu, độ dài và (tùy chọn) chèn (chuỗi)
- trả lại phần bị cắt
- sửa đổi chuỗi gốc
Vấn đề là, yêu cầu 3d không thể được thực hiện vì các chuỗi là bất biến (liên quan: 1 , 2 ), tôi đã tìm thấy nhận xét chuyên dụng nhất ở đây :
Trong JavaScript, chuỗi là kiểu giá trị nguyên thủy chứ không phải đối tượng ( spec ). Trong thực tế, tính đến ES5, họ là một trong những loại chỉ có 5 giá trị bên cạnh null, undefined, numbervà boolean. Strings được sự phân công của giá trị và không bằng cách tham khảo và được thông qua như vậy. Vì vậy, các chuỗi không chỉ là bất biến, chúng còn là một giá trị . Thay đổi chuỗi "hello"thành "world"giống như việc quyết định từ nay số 3 là số 4 ... chẳng có ý nghĩa gì.
Vì vậy, với điều đó trong tài khoản, người ta có thể mong đợi điều " string.splice" chỉ:
- chấp nhận tối đa 2 đối số: vị trí bắt đầu, độ dài (việc chèn không có ý nghĩa gì vì chuỗi không bị thay đổi)
- trả lại phần bị cắt
đó là cái gì substr; Hay cách khác,
- chấp nhận tối đa 3 đối số: vị trí bắt đầu, độ dài và (tùy chọn) chèn (chuỗi)
- trả về chuỗi đã sửa đổi (không có phần cắt và có chèn)
đó là chủ đề của phần tiếp theo.
Các giải pháp
Nếu bạn quan tâm đến việc tối ưu hóa, bạn có thể nên sử dụng triển khai của 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);
}
Tuy nhiên, việc điều trị chỉ số ngoài ranh giới có thể khác nhau. Tùy thuộc vào nhu cầu của bạn, bạn có thể muốn:
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;
}
hoặc thậm chí
index = index % this.length;
if (index < 0)
index = this.length + index;
Nếu bạn không quan tâm đến hiệu suất, bạn có thể muốn điều chỉnh đề xuất của Kumar, dễ hiểu hơn:
String.prototype.splice = function(index, count, add) {
var chars = this.split('');
chars.splice(index, count, add);
return chars.join('');
}
Hiệu suất
Sự khác biệt về hiệu suất tăng lên đáng kể theo độ dài của dây. jsperf cho thấy rằng đối với các chuỗi có độ dài là 10, giải pháp thứ hai (tách và nối) chậm hơn hai lần so với giải pháp trước đây (sử dụng lát cắt), đối với chuỗi 100 ký tự là x5 và đối với chuỗi 1000 ký tự là x50, tính bằng Ops / giây là:
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
lưu ý rằng tôi đã thay đổi đối số 1 và 2 khi chuyển từ 10 chữ cái sang 100 chữ cái (tôi vẫn ngạc nhiên khi bài kiểm tra 100 chữ cái chạy nhanh hơn bài kiểm tra 10 chữ cái).
str.splitcó thể là chức năng bạn đang tìm kiếm: google.com/#q=javascript+string+split