substrとsubstringの違いは何ですか?


844

違いは何ですか

alert("abc".substr(0,2));

そして

alert("abc".substring(0,2));

どちらも「ab」を出力するようです。


13
最近substring 、Chromeで他のすべてのパフォーマンスよりも @Derekы會功夫に注意してください。
Steven Lu

4
@Derekコメントに追加... sliceメソッドとsubstringは異なり、は負のパラメーターの調整を処理しません。
Dzeimsas Zvirblis

1
もっと重要な質問は「JavaScriptにはsubstrメソッドとメソッドの両方があるのはなぜsubstringですか?」これは本当にオーバーロードの推奨方法ですか?
シンジャイ

7
今日の時点で、MDNはおよそ大きな赤い警告持ってsubstr()あなたがここにドキュメントのページの上部にある「擬似非推奨」と呼ぶかもしれないものであること:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...を -誰かがこれについてより多くの情報を持っていますか?たとえばsubstr()、将来実際に廃止する予定のブラウザはありますか?または、Steven Luが示唆したように、substr()今後の使用にはパフォーマンス上のデメリットがあるのでしょうか?
ジェームズ2018

回答:


930

違いは2番目の引数です。の2番目の引数substringは、停止する(ただし、含まない)インデックスですが、2番目の引数substrは、返される最大長です。

リンク?

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substr

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substring


61
エラーの一般的な原因のように聞こえます。違いを知ってよかった。これに関する追加のコメントがここにあります:rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
schnaader

3
@Pawelまた、あなたが文字列(なし第二引数)の最後にそれをしたいとき
アンドレ・Chalella

これはばかげているので、Javaアプレットを開発する日々をほとんど逃してしまいます。(当時、IEについて心配する必要があったため、「ほぼ」)
Michael Scheper

2
また、最初の引数の違いについても言及する必要があります。これはsubstrの場合は負になる可能性があります(この場合、末尾から始まります)が、部分文字列の場合は違います。JefferMCの回答を参照してください。しかし、投票数が非常に少ないため、多くの人がこの重要な部分を逃す可能性があります。
youen

2
これははるかに最もupvoted答えであるとして、おそらく、それを含めるように編集する必要があります String.prototype.substr()廃止されました...(それを定義した附属書B ECMA-262標準の導入状態:「...プログラマ使用したり、仮定するべきではありません新しいECMAScriptコードを記述するときのこれらの機能と動作の存在… ")
TS

309

substringMDN)はパラメータをとして受け取ります(from, to)
substrMDN)は、パラメータをとして受け取ります(from, length)

更新:MDNはsubstrレガシーを考慮します。

alert("abc".substr(1,2)); // returns "bc"
alert("abc".substring(1,2)); // returns "b"

substringもう1つの文字列抽出方法であるsliceと同様に、takeインデックスを覚えておくことができます

0から開始する場合は、どちらの方法も使用できます。


140
.substring()インデックスをとります。名前に「i」が付いているのはそれだけなので、覚えておいてください。 .slice()インデックスも取ります。
colllin 2014年

10
@ colllin、iとインデックスに関するコメントは確かに回答に移動する必要があります!
MyDaftQuestions 2015年

35

yatima2975の答えでほのめかされたように、追加の違いがあります:

substr()文字列の末尾からのオフセットとして負の開始位置を受け入れます。 substring()ではない。

MDNから:

startが負の場合、substr()はそれを文字列の末尾からの文字インデックスとして使用します。

機能の違いを要約すると、

substring(begin-offset, end-offset-exclusive)begin-offsetが0それ以上の場合

substr(begin-offset, length) begin-offsetも負の場合があります


25

私が最近遭遇したもう1つの問題は、IE 8では"abcd".substr(-1)誤ってが"abcd"返さ"d"れることですが、Firefox 3.6は本来のとおりに返されます。slice両方で正しく動作します。

このトピックの詳細については、こちらをご覧ください


17

主な違いは

substr()を使用すると、返す最大長を指定できます

substring()を使用すると、インデックスを指定でき、2番目の引数は包括的ではありません

等しい引数と負の引数の処理など、substr()とsubstring()の間にはいくつかの追加の微妙な点があります。また、substring()とslice()は似ていますが、必ずしも同じではないことに注意してください。

  //*** length vs indices:
    "string".substring(2,4);  // "ri"   (start, end) indices / second value is NOT inclusive
    "string".substr(2,4);     // "ring" (start, length) length is the maximum length to return
    "string".slice(2,4);      // "ri"   (start, end) indices / second value is NOT inclusive

  //*** watch out for substring swap:
    "string".substring(3,2);  // "r"    (swaps the larger and the smaller number)
    "string".substr(3,2);     // "in"
    "string".slice(3,2);      // ""     (just returns "")

  //*** negative second argument:
    "string".substring(2,-4); // "st"   (converts negative numbers to 0, then swaps first and second position)
    "string".substr(2,-4);    // ""
    "string".slice(2,-4);     // ""

  //*** negative first argument:
    "string".substring(-3);   // "string"        
    "string".substr(-3);      // "ing"  (read from end of string)
    "string".slice(-3);       // "ing"        

次のような有用な「負の2番目の引数」を見逃しましたslice"string".slice(2,-2); // "ri"
ポール

8

違いは2番目のパラメーターです。2番目のパラメーターは、どちらの数値も2つの異なるものを期待しています。

部分文字列を使用する場合、2番目のパラメータは最初のインデックスに含まれません。

var s = "string";
s.substring(1, 3); // would return 'tr'

var s = "another example";
s.substring(3, 7); // would return 'ther'

substrを使用する場合、2番目のパラメーターは部分文字列に含める文字数です。

var s = "string";
s.substr(1, 3); // would return 'tri'

var s = "another example";
s.substr(3, 7); // would return 'ther ex'

5

大きな違いは、されてsubstr()いる非推奨の方法はまだ使用できますが、それらは完全にいつか将来的に削除されることが予想されるので、注意して使用する必要があります。あなたはあなたのコードからそれらの使用を取り除くために働くべきです。そしてそのsubstring()方法は成功し、前者を特定した。


2
の廃止を示す信頼できる情報源を指摘できますsubstr()か?何人かから読んだことがありますが、この声明を支持する情報がウェブ上で見つかりません。:プラス、Mozillaは非推奨/廃止された機能のリストにそれが含まれていませんdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
DanielM

@DanielM私が覚えている限りでは、この回答を投稿したときに非推奨になりました。おそらく記事が変更され、現在は非推奨ではありませんしかし確実ではありません) ..しかし、sstut.com / javascript / substring-などの一部の記事にはまだ記録されています廃止予定のmethod.php
5ervant 2016年

3
@DanielMがString.prototype.substr()で定義されている附属書B ECMA-262標準の導入状態:「新しいECMAScriptのコードを書くときに...プログラマは、これらの機能や行動の存在を使用するか、と仮定してはいけません...。」
TS

@TS substr()は、一部のドキュメントでは非推奨として実際に示されています。
-5ervant

2
これは、今日のところ受け入れられた答えになるはずです。代替手段があるときにレガシー関数を使用することは、優れたコードのオプションではありません。Googleがこのページにアクセスする際に、この回答を目立たせるために賛成してください。
vbezhenar


3

substring(): 「start」と「end」の2つのパラメーターがあります。

  • startパラメータは必須であり、抽出を開始する位置を指定します。
  • endパラメータはオプションで、抽出を終了する位置を指定します。

endパラメータを指定しない場合、開始位置から文字列の終わりまでのすべての文字が抽出されます。

var str = "Substring Example";
var result = str.substring(0, 10);
alert(result);

Output : Substring

startパラメータの値がendパラメータの値より大きい場合、このメソッドは2つの引数を入れ替えます。つまり、開始は終了として使用され、終了は開始として使用されます。

var str = "Substring Example";
var result = str.substring(10, 0);
alert(result);

Output : Substring

substr():2つのパラメーター「start」と「count」があります。

  • startパラメータは必須であり、抽出を開始する位置を指定します。

  • countパラメータはオプションであり、抽出する文字数を指定します。

var str = "Substr Example";
var result = str.substr(0, 10);
alert(result);


Output : Substr Exa

countパラメータを指定しない場合、開始位置から文字列の最後までのすべての文字が抽出されます。countが0または負の場合、空の文字列が返されます。

var str = "Substr Example";
var result = str.substr(11);
alert(result);

Output : ple


2

substring(startIndex、endIndex(含まれていない))

substr(startIndex、文字数)

const string = 'JavaScript';

console.log('substring(1,2)', string.substring(1,2)); // a
console.log('substr(1,2)', string.substr(1,2)); // av
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.