String.sliceとString.substringの違いは何ですか?


834

これらの2つの方法の違いは誰か知っていますか?

String.prototype.slice
String.prototype.substring

216
JavaScriptのデザインが悪い例であり、すべて同じことを行う3つのメソッドがありましたが、癖が異なっていました。IMO sliceは、予期しない動作が最も少ないものです。
ボビンス2010

2
IMOサブストリングを使用してidxから最後までサブストリングを取得すると、一目で理解しやすくなります。特に初心者向け
プルンジャン

1
このウェブサイトによると、slice実際に置き換えることができ、substringそれを使用する理由はありません。
Derek款會功夫

5
@AmolMKulkarniまったく真実ではありません。しようとするとvar a = "asdf".substring(-1);、として扱われvar a = "asdf".substring(0);ます。スローされる例外はありません。また、を使用するとvar a = "asdf".substring(2, -1);、(以前のように)の0代わりに使用され-1、引数を交換してのように動作しvar a = "asdf".substring(0, 2);ます。私はIE 8でもこれらを試し、例外なく結果を得ました
Ian

35
「IE 8で試してみました」-プログラミングが大好きです。
2015年

回答:


861

slice()substring()いくつかの異なる動作と同様に機能します。

Syntax: string.slice(start, stop);
Syntax: string.substring(start, stop);

彼らが共通して持っているもの:

  1. 場合start等号stop:空の文字列を返します。
  2. stop省略した場合:文字列の末尾まで文字を抽出します
  3. どちらかの引数が文字列の長さより大きい場合は、代わりに文字列の長さが使用されます。

の区別 substring()

  1. の場合start > stopsubstringこれらの2つの引数を入れ替えます。
  2. どちらかの引数が負またはの場合NaN、それはあたかもそうであるかのように扱われ0ます。

の区別 slice()

  1. の場合start > stopslice()空の文字列を返します。(""
  2. start負の場合:substr()Firefox とまったく同じように、文字列の最後から文字を設定します。この動作は、FirefoxとIEの両方で見られます。
  3. stop負の場合:ECMA仕様でカバーされているstring.length – Math.abs(stop)ように0に制限されている(したがって)を除いて、stopを(元の値)に設定します。Math.max(0, string.length + stop)

ソース:プログラミングと開発の基本アート:Javascript:substr()とsubstring()


8
の最後のノートではslice()、それはstring.length - stop
Andy

16
あなたの最後のノートではslice()(string.length – 1) + stopそれが否定的であることを明確にするために、またはそれが否定的であるべきだと思います(string.length – 1) – Math.abs(stop)
Oriol

9
@Longpoke:String.sliceに一貫した文字列メソッドが存在するように追加されましたArray.slicesubstring彼らは永遠にそこにいたので、彼らはそれを壊さずに別の方法を追加しました。1.一貫性がいい、2。CoffeeScriptのスライス構文が配列や文字列で機能するようにするという、くだらない決定はほとんどありません。@Oriol:それを編集した。
飛んで羊

6
Firefox 22では、部分文字列とスライスの間にパフォーマンスの違いがあるようです 。jsperf.com/ string
Rick

4
アンディは正しかった。が負の場合stopに設定されます。覚えている最後の文字を抽出した後のインデックスであります!string.length + stopstopstop
user1537366 14

97

注:急いでいる場合や短い回答を探している場合は、回答の下部までスクロールして最後の2行を読んでください。急いでいない場合は、全体を読んでください。


事実を述べることから始めましょう:

構文:
string.slice(start,end)
string.substr(start,length)
string.substring(start,end)
注#1:slice()==substring()

それは何ですか?
このslice()メソッドは、文字列の一部を抽出し、抽出した部分を新しい文字列で返します。
このsubstr()メソッドは、指定された位置の文字から始まる文字列の一部を抽出し、指定された数の文字を返します。
このsubstring()メソッドは、文字列の一部を抽出し、抽出した部分を新しい文字列で返します。
注2:slice()==substring()

元の文字列を変更しますか?
slice()しません
substr()しません
substring()しません
#3の点に注意してください。slice()==substring()

負の数を引数として使用:
slice()文字列
substr()の末尾から始まる文字を選択します
substring()。文字列の末尾から始まる文字を選択します
slice()==substr()

最初の引数は二より大きい場合:
slice()ん実行していない
substr()第二引数は、位置が、長さの値ではないので、それは何の問題もなく、いつものように実行します
substring()二つの引数を入れ替え、そしていつものように実行します

最初の引数:
slice()必須、指示:開始インデックスが
substr()必要、指示:開始インデックスが
substring()必要、指示:開始インデックス
注#4:slice()==substr()==substring()

2番目の引数:
slice()オプション、抽出を終了する位置(最大、ただし含まない)
substr()オプションオプション、抽出する文字数オプション、抽出を終了する
substring()位置(最大、ただし含まない)
注#5:slice()==substring()

2番目の引数が省略された場合はどうなりますか?
slice()文字列の開始位置から終了までの
substr()すべての文字を選択します文字列の開始位置から終了までのすべての文字を選択します文字列の開始位置から終了までの
substring()すべての文字を選択します
注#6:slice()==substr()==substring()

だから、違いがあると言うことができます slice()ありますがsubstr()substring()は基本的にのコピーですslice()

概要:
停止するインデックス(位置)がわかっている場合(ただし、含まない)、slice()
抽出する文字の長さがわかっている場合に使用します。substr()


11
SUBSTR()は使用すべきではありませんdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
キリー

24

ベンナデルはこれについての良い記事を書いています、彼はこれらの関数へのパラメータの違いを指摘します:

String.slice( begin [, end ] )
String.substring( from [, to ] )
String.substr( start [, length ] )

また、スライスするパラメータが負の場合、最後から文字列を参照することも指摘しています。Substringとsubstrにはありません。

これに関する彼の記事はここにあります。


3
これは不正解です。substrは負のパラメータを処理します。 '0123456789'.substr(-3, 2) -> '78'
Neil Fraser、

14

1つの答えで結構ですが、少し読んでおく必要があります。特に新しい用語「停止」を使用します。

私の囲碁-上記のダニエルによる最初の回答に加えて、それを有用にするために違いによって整理されています:

1)負のインデックス。サブストリングは正のインデックスを必要とし、負のインデックスを0に設定します。スライスの負のインデックスは、文字列の末尾からの位置を意味します。

"1234".substring(-2, -1) == "1234".substring(0,0) == ""
"1234".slice(-2, -1) == "1234".slice(2, 3) == "3"

2)インデックスの交換。サブストリングは、インデックスを並べ替えて、最初のインデックスを2番目のインデックス以下にします。

"1234".substring(3,2) == "1234".substring(2,3) == "3"
"1234".slice(3,2) == ""

--------------------------

一般的なコメント-2番目のインデックスがスライスまたは部分文字列の最後の文字の後の位置であることは奇妙だと思います。「1234」.slice(2,2)が「3」を返すことを期待します。これは、Andyの混乱を正当化します-「1234」.slice(2、-1)が「34」を返すことを期待します。はい、これは私がJavaScriptを初めて使用することを意味します。これは、次の動作も意味します。

"1234".slice(-2, -2) == "", "1234".slice(-2, -1) == "3", "1234".slice(-2, -0) == "" <-- you have to use length or omit the argument to get the 4.
"1234".slice(3, -2) == "", "1234".slice(3, -1) == "", "1234".slice(3, -0) == "" <-- same issue, but seems weirder.

私の2c。


11

部分文字列とスライスの違いは、否定的で見落とされている行を海外で扱う方法です。

サブストリング(開始、終了)

負の引数はゼロとして解釈されます。値が大きすぎると、文字列の長さに切り捨てられます。alert( "testme" .substring(-2)); // "testme"、-2は0になります

さらに、start> endの場合、引数は交換されます。つまり、プロットラインは開始と終了の間で戻ります。

alert ( "testme" .substring (4, -1)); // "test"
// -1 Becomes 0 -> got substring (4, 0)
// 4> 0, so that the arguments are swapped -> substring (0, 4) = "test"

スライス

負の値は行の終わりから測定されます:

alert ( "testme" .slice (-2)); // "me", from the end position 2
alert ( "testme" .slice (1, -1)); // "estm", from the first position to the one at the end.

奇妙な論理部分文字列よりもはるかに便利です。

IE8-を除くすべてのブラウザーでサポートされるsubstrへの最初のパラメーターの負の値。

これらの3つの方法のいずれかを選択すると、ほとんどの状況で使用されます-それはスライスになります:負の引数であり、最も明白に維持および動作します。


4

substr:指定されたインデックスに基づいて文字列の一部をフェッチすることを提供しています。substr- string.substr(start、end)startの構文-開始インデックスは、フェッチの開始位置を示します。end-endインデックスは、文字列がどこにフェッチされるかを示します。オプションです。

スライス:指定されたインデックスに基づいて文字列の一部を取得するために提供しています。これにより、ポジティブとインデックスを指定できます。スライスの構文-string.slice(start、end)開始-開始インデックスは、フェッチの開始位置を示します。終了-終了インデックスは、文字列のフェッチ場所までを通知します。オプションです。「スプライス」では、開始インデックスと終了インデックスの両方が正と負のインデックスを取るのに役立ちます。

文字列の「スライス」のサンプルコード

var str="Javascript";
console.log(str.slice(-5,-1));

output: crip

文字列内の「substring」のサンプルコード

var str="Javascript";
console.log(str.substring(1,5));

output: avas

[*注:負のインデックスは文字列の最後から始まります。]


3

スライスメソッドとサブストリングメソッドの唯一の違いは引数です。

どちらもstart / fromとend / toなどの2つの引数を取ります。

負の値を部分文字列メソッドの最初の引数として渡すことはできませんが、スライスメソッドは負の値を最後からトラバースします。

スライスメソッドの引数の詳細:

REF:http : //www.thesstech.com/javascript/string_slice_method

議論

start_index スライスの開始位置からのインデックス。負の値が指定されている場合、最後から開始することを意味します。たとえば、最後の文字は-1です。 end_index スライス終了後のインデックス。指定しない場合、スライスはstart_indexから文字列の終わりまで取得されます。負の値の場合、インデックスは文字列の最後から測定されます。

サブストリングメソッド引数の詳細:

REF:http : //www.thesstech.com/javascript/string_substring_method

議論

from 負でない整数で、サブストリングが始まるインデックスを指定する必要があります。 to 部分文字列が終了する前にインデックスを提供するオプションの非負整数。


0

の場合slice(start, stop)stopが負の場合、stopは次のように設定されます。

string.length  Math.abs(stop)

のではなく:

string.length  1  Math.abs(stop)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.