Здається, є багато плутанини, яку усунули лише коментарі elclanrs та raina77ow, тож дозвольте мені опублікувати уточнюючу відповідь.
Уточнення
Від " string.splice" можна очікувати, що він, як той для масивів:
- приймає до 3 аргументів: початкова позиція, довжина та (за бажанням) вставка (рядок)
- повертає вирізану частину
- змінює вихідний рядок
Проблема, 3D вимога не може бути виконано , так як рядки є незмінними (пов'язані з : 1 , 2 ), я знайшов найвідданіший коментар тут :
У JavaScript рядки є примітивними типами значень, а не об'єктами ( специфікація ). Справді, як в ES5, вони один з небагатьох 5 типів значень разом null, undefined, numberі boolean. Рядки присвоюються за значенням, а не за посиланням і передаються як такі. Таким чином, рядки не просто незмінні, вони є цінністю . Змінювати рядок "hello"як "world"все одно, що вирішити, що відтепер число 3 є числом 4 ... немає сенсу.
Отже, враховуючи це, можна очікувати лише " string.splice":
- приймає до 2 аргументів: початкова позиція, довжина (вставка не має сенсу, оскільки рядок не змінено)
- повертає вирізану частину
що саме substrробить; або, як варіант,
- приймає до 3 аргументів: початкова позиція, довжина та (за бажанням) вставка (рядок)
- повертає змінений рядок (без вирізаної частини та з вставкою)
що є предметом наступного розділу.
Рішення
Якщо вам потрібна оптимізація, вам слід скористатися реалізацією Майка:
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;
Якщо ви не дбаєте про продуктивність, можливо, ви захочете адаптувати пропозицію Кумара, яка є більш прямою:
String.prototype.splice = function(index, count, add) {
var chars = this.split('');
chars.splice(index, count, add);
return chars.join('');
}
Продуктивність
Різниця у виконанні різко зростає із збільшенням довжини струни. jsperf показує , що для рядків довжиною 10 останнє рішення (розбиття та приєднання) вдвічі повільніше, ніж попереднє рішення (з використанням зрізу), для рядків із 100 літер - x5, а для рядків з 1000 літер - 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