4

JavaScript String オブジェクトには、substring と substr の 2 つの部分文字列関数があります。

  • substringは との 2 つのパラメータbeginIndexを取りますendIndex

  • substrも 2 つのパラメータbeginIndexとを受け取りますlength

2 つのバリアント間の任意の範囲を変換するのは簡単ですが、(日常のプログラミングで) 2 つが通常どのように使用されるかについて、何らかの意味があるのではないかと思います。私はインデックス/長さのバリアントを好む傾向がありますが、その理由については十分な説明がありません.

どんなプログラミングをするかにもよると思いますが、強い意見があれば聞かせてください。

(絶対、相対) 範囲が (絶対、絶対) 範囲よりも適しているのはどのような場合で、逆の場合はどのような場合ですか?

アップデート:

これは JavaScript 自体の質問ではありません (JavaScript はたまたま両方のバリアントを実装しているだけです [これはばかげていると思います])。どちらか一方を好む理由について、確固たる議論を探しています。議論を少し広げるために、どちらかのアプローチで使用するためにデータ構造をどのように設計することを好みますか?

4

4 に答える 4

3

startIndex私は, endIndexvariant ( substring)を好みます。String.substring()これは、Java でも同じように動作し、最も頻繁に (可能な場合) 使用する言語に関係なく、同じ概念に固執する方が効率的だと感じているためです。

もっと C# の作業を行っていた場合は、他のバリアントをもっと使用する可能性があります。これString.Substring()が C# での動作だからです。

JavaScript が両方を持っているというあなたのコメントに答えるために、substr()後でブラウザーに追加されたようですsubstring()(参照- substr()JavaScript 1.0 の一部でしたが、ほとんどのブラウザー ベンダーは後になるまで実装しなかったようです)。これは、初期の言語の実装者でさえ機能の重複を認識していたことを示唆しています。Java Scriptsubstring()の商標を活用しようとして最初に来たことをお勧めします。それにもかかわらず、彼らはECMA-262でこの重複を認識し、それを削除するためにいくつかの小さな手順を実行したようです:

  • substring() : ECMA バージョン: ECMA-262
  • substr() : ECMA バージョン: なし。ただし、ECMA-262 ed. 3には、substrの統一されたセマンティクスを示唆する非規範的なセクションがあります

個人的には、2 番目のパラメーターが負になる可能性がある場所は気にしませんsubstring()。これにより、最初のパラメーターと文字列の長さから 2 番目のパラメーターを引いた長さの間の文字が返されます。もちろん、それをより明示的に実現することはすでに可能ですが、この設計は多くの開発者を混乱させると思います。

String s1 = "The quick brown fox jumps over the lazy dog";
String s2 = s1.substring(20, -13); // "jumps over"
于 2009-08-14T17:27:09.210 に答える
2

When is a (absolute, relative) range more suited than an (absolute, absolute) and vice versa?

The former, when you know how much, the latter when you know where.

I presume substring is implemented in terms of substr:

substring( b, e ) {
  return substr( b, e - b );
}

or substr in terms of substring:

substr( b, l)  {
  return substring( b, b + l );
}
于 2009-08-14T08:22:06.153 に答える
1

I slightly prefer the startIndex, endIndex variant, since then to get the last bit of a string I can do:

string foo = bar.substring(5, foo.length());

instead of:

string foo = bar.substring(5, foo.length() - 5);
于 2009-08-14T08:18:58.250 に答える
0

ケースにもよりますが、取り出したい文字数が正確にわかっている場合が多く、長さのパラメーター化から始めることを好みます。しかし、長い文字列で 2 つのトークンを検索し、それらのインデックスを取得したケースは簡単にわかりますが、どちらのケースを使用するのも簡単な計算ですが、この場合は開始インデックスと終了インデックスを使用することをお勧めします。

また、文書作成者の観点からは、同じ基本的な意味を持つ 2 つのパラメーターを持つ方が、記述しやすく、覚えやすくなります。

これらの関数のそれぞれは、開始よりも小さい終了、負の長さ、負の開始、または文字列の終了を超える長さまたは終了など、奇妙な値が与えられたときに適切な保存を行います。

JavaScript の場合、ベスト プラクティスはsubstringoverを使用するsubstrことです。これは、より多くの (通常は古い) ブラウザーでサポートされているためです。代わりに BasicScript を使っていたら、MID() と MIDDLE() 関数があったでしょうか? BASIC 構文が嫌いな人はいますか?

于 2009-12-15T23:08:52.180 に答える