Il semble y avoir beaucoup de confusion qui n'a été abordée que dans les commentaires d'elclanrs et de raina77ow, alors permettez-moi de poster une réponse clarifiant.
Clarification
De " string.splice" on peut s'attendre à ce que, comme celui des tableaux:
- accepte jusqu'à 3 arguments: position de départ, longueur et (facultativement) insertion (chaîne)
- renvoie la partie découpée
- modifie la chaîne d'origine
Le problème est que l'exigence 3d ne peut pas être remplie car les chaînes sont immuables (liées: 1 , 2 ), j'ai trouvé le commentaire le plus dédié ici :
En JavaScript, les chaînes sont des types de valeur primitifs et non des objets ( spécification ). En fait, de ES5, ils sont l' un des seuls 5 types de valeur à côté null, undefined, numberet boolean. Les chaînes sont attribuées par valeur et non par référence et sont transmises comme telles. Ainsi, les chaînes ne sont pas simplement immuables, elles sont une valeur . Changer la chaîne "hello"pour qu'elle soit, "world"c'est comme décider qu'à partir de maintenant le nombre 3 est le nombre 4 ... cela n'a aucun sens.
Donc, avec cela en compte, on peut s'attendre à ce que la string.splicechose " " soit seulement:
- accepte jusqu'à 2 arguments: position de départ, longueur (l'insertion n'a aucun sens car la chaîne n'est pas modifiée)
- renvoie la partie découpée
qui est ce que substrfait; Ou bien,
- accepte jusqu'à 3 arguments: position de départ, longueur et (facultativement) insertion (chaîne)
- renvoie la chaîne modifiée (sans la partie coupée et avec insertion)
qui fait l'objet de la section suivante.
Solutions
Si vous vous souciez de l'optimisation, vous devriez probablement utiliser l'implémentation de 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);
}
Cependant, le traitement de l'indice hors limites peut varier. Selon vos besoins, vous voudrez peut-être:
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;
}
ou même
index = index % this.length;
if (index < 0)
index = this.length + index;
Si vous ne vous souciez pas des performances, vous voudrez peut-être adapter la suggestion de Kumar qui est plus simple:
String.prototype.splice = function(index, count, add) {
var chars = this.split('');
chars.splice(index, count, add);
return chars.join('');
}
Performance
La différence de performances augmente considérablement avec la longueur de la corde. jsperf montre que pour les chaînes d'une longueur de 10, la dernière solution (division et jointure) est deux fois plus lente que la première solution (en utilisant slice), pour les chaînes de 100 lettres, c'est x5 et pour les chaînes de 1000 lettres, c'est x50, dans Ops / sec c'est:
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
notez que j'ai changé les 1er et 2ème arguments en passant de 10 lettres à 100 lettres (je suis toujours surpris que le test pour 100 lettres soit plus rapide que pour 10 lettres).
str.splitpeut-être la fonction que vous recherchez: google.com/#q=javascript+string+split