Tampaknya ada banyak kebingungan yang hanya diatasi di komentar oleh elclanrs dan raina77ow, jadi izinkan saya memposting jawaban klarifikasi.
Klarifikasi
Dari " string.splice" orang mungkin mengharapkannya, seperti yang untuk array:
- menerima hingga 3 argumen: posisi awal, panjang dan (opsional) penyisipan (string)
- mengembalikan bagian yang dipotong
- memodifikasi string asli
Masalahnya, persyaratan 3d tidak dapat dipenuhi karena string tidak dapat diubah (terkait: 1 , 2 ), saya telah menemukan komentar paling berdedikasi di sini :
Dalam JavaScript, string adalah tipe nilai primitif dan bukan objek ( spesifikasi ). Bahkan, pada ES5, mereka salah satu dari hanya 5 jenis nilai bersama null, undefined, numberdan boolean. String ditetapkan berdasarkan nilai dan bukan dengan referensi dan diteruskan seperti itu. Jadi, string bukan hanya tidak bisa diubah, tapi juga sebuah nilai . Mengubah string "hello"menjadi "world"seperti memutuskan bahwa mulai sekarang angka 3 adalah angka 4 ... itu tidak masuk akal.
Jadi, dengan pertimbangan itu, orang mungkin mengharapkan " string.splice" untuk hanya:
- menerima hingga 2 argumen: posisi awal, panjang (penyisipan tidak masuk akal karena string tidak diubah)
- mengembalikan bagian yang dipotong
yaitu apa yang substrdilakukannya; atau, sebagai alternatif,
- menerima hingga 3 argumen: posisi awal, panjang dan (opsional) penyisipan (string)
- mengembalikan string yang dimodifikasi (tanpa bagian yang dipotong dan dengan penyisipan)
yang merupakan subjek dari bagian selanjutnya.
Solusi
Jika Anda peduli tentang pengoptimalan, Anda mungkin harus menggunakan implementasi 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);
}
Memperlakukan indeks di luar batas mungkin berbeda-beda. Bergantung pada kebutuhan Anda, Anda mungkin menginginkan:
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;
}
atau bahkan
index = index % this.length;
if (index < 0)
index = this.length + index;
Jika Anda tidak peduli dengan kinerja, Anda mungkin ingin menyesuaikan saran Kumar yang lebih langsung:
String.prototype.splice = function(index, count, add) {
var chars = this.split('');
chars.splice(index, count, add);
return chars.join('');
}
Performa
Perbedaan penampilan meningkat drastis dengan panjang senar. jsperf menunjukkan , bahwa untuk string dengan panjang 10 solusi terakhir (pemisahan & penggabungan) dua kali lebih lambat dari solusi sebelumnya (menggunakan slice), untuk string 100 huruf x5 dan untuk string 1000 huruf x50, di Ops / detik itu:
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
perhatikan bahwa saya telah mengubah argumen 1 dan 2 saat berpindah dari 10 huruf menjadi 100 huruf (tetap saja saya terkejut bahwa tes untuk 100 huruf berjalan lebih cepat dari itu untuk 10 huruf).
str.splitmungkin fungsi yang Anda cari: google.com/#q=javascript+string+split