Кажется, существует большая путаница, которая была устранена только в комментариях 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