Sadece elclanrs ve raina77ow tarafından yapılan yorumlarda ele alınan çok fazla kafa karışıklığı var gibi görünüyor, bu yüzden açıklayıcı bir cevap göndermeme izin verin.
Açıklama
" string.splice" Den , diziler için olan gibi, bunun olması beklenebilir:
- 3 adede kadar argüman kabul eder: başlangıç konumu, uzunluk ve (isteğe bağlı olarak) ekleme (dize)
- kesilen kısmı döndürür
- orijinal dizeyi değiştirir
Sorun şu ki, dizeler değişmez olduğu için 3d gereksinimi yerine getirilemiyor (ilgili: 1 , 2 ), burada en özel yorumu buldum :
JavaScript'te dizeler ilkel değer türleridir, nesneler değildir ( spec ). Aslında, ES5 itibariyle, bunlar yanında sadece 5 değer türleri birisin null, undefined, numberve boolean. Yaylı tarafından atanır değeri ve değildir referansla ve bu şekilde geçirilir. Dolayısıyla dizeler yalnızca değişmez değil, bir değerdir . Dizeyi "hello"olacak şekilde değiştirmek, "world"bundan sonra 3 sayısının 4 olduğuna karar vermek gibidir ... hiç mantıklı değil.
Dolayısıyla, hesaba katıldığında, " string.splice" şeyinden yalnızca:
- en fazla 2 argüman kabul eder: başlangıç konumu, uzunluk (dizge değiştirilmediğinden ekleme bir anlam ifade etmez)
- kesilen kısmı döndürür
ne substryapar; Veya alternatif olarak,
- 3 adede kadar argüman kabul eder: başlangıç konumu, uzunluk ve (isteğe bağlı olarak) ekleme (dize)
- değiştirilmiş dizeyi döndürür (kesilen kısım olmadan ve ekleme ile)
sonraki bölümün konusu.
Çözümler
Optimize etmeyi önemsiyorsanız, muhtemelen Mike'ın uygulamasını kullanmalısınız:
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);
}
Bununla birlikte, sınır dışı indeksini tedavi etmek değişebilir. İhtiyaçlarınıza bağlı olarak şunları isteyebilirsiniz:
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;
}
ya da
index = index % this.length;
if (index < 0)
index = this.length + index;
Performansı önemsemiyorsanız, Kumar'ın önerisini uyarlamak isteyebilirsiniz, bu daha basittir:
String.prototype.splice = function(index, count, add) {
var chars = this.split('');
chars.splice(index, count, add);
return chars.join('');
}
Verim
Performanslardaki fark, ipin uzunluğu ile büyük ölçüde artar. jsperf , 10 uzunluğundaki dizeler için ikinci çözümün (bölme ve birleştirme) önceki çözümden (dilim kullanarak) iki kat daha yavaş olduğunu, 100 harflik dizeler için x5 olduğunu ve 1000 harfli dizeler için x50 olduğunu Ops / saniye:
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
10 harften 100 harfe geçerken 1. ve 2. argümanları değiştirdiğime dikkat edin (yine de 100 harf için yapılan testin 10 harf için olandan daha hızlı çalışmasına şaşırıyorum).
str.splitaradığınız işlev olabilir: google.com/#q=javascript+string+split