elclanrsとraina77owのコメントだけで対処された混乱がたくさんあるようですので、明確な答えを投稿させてください。
明確化
" string.splice"から、配列の場合のように、それを期待するかもしれません。
- 最大3つの引数を受け入れます:開始位置、長さ、および(オプションで)挿入(文字列)
- 切り抜いた部分を返します
- 元の文字列を変更します
問題は、文字列が不変であるために3D要件を満たすことができないことです(関連:1、2を、私はほとんど専用のコメントを見つけた)ここに:
JavaScriptでは、文字列はプリミティブ値型であり、オブジェクト(spec)ではありません。実際には、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;
パフォーマンスを気にしない場合は、より簡単なKumarの提案を採用することをお勧めします。
String.prototype.splice = function(index, count, add) {
var chars = this.split('');
chars.splice(index, count, add);
return chars.join('');
}
パフォーマンス
弦の長さによって性能の差が大きくなります。jsperfは、Ops /で、長さが10の文字列の場合、後者のソリューション(分割と結合)は前者のソリューション(スライスを使用)の2倍遅く、100文字の文字列の場合はx5、1000文字の文字列の場合はx50であることを示しています。秒それは:
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文字から100文字に移動するときに、1番目と2番目の引数を変更したことに注意してください(100文字のテストが10文字のテストよりも高速に実行されることに驚いています)。
str.splitあなたが探している関数かもしれません:google.com/#q=javascript+string+split