文字列が別の文字列「StartsWith」であるかどうかを確認する方法は?


1690

String.StartsWithJavaScript でC#に相当するものをどのように記述しますか?

var haystack = 'hello world';
var needle = 'he';

haystack.startsWith(needle) == true

注:これは古い質問であり、コメントで指摘されているように、ECMAScript 2015(ES6)が.startsWithメソッドを導入しました。ただし、この更新(2015)の執筆時点では、ブラウザーのサポートは完全ではありません

回答:


1773

ECMAScript 6のString.prototype.startsWith()方法を使用できますが、すべてのブラウザーでまだサポートされていません。シム/ポリフィルを使用して、それをサポートしていないブラウザに追加する必要があります。仕様に記載されているすべての詳細に準拠する実装の作成は少し複雑です。忠実なシムが必要な場合は、次のいずれかを使用します。

メソッドをシム処理した後(または、すでにそれをサポートしているブラウザーとJavaScriptエンジンのみをサポートしている場合)、次のように使用できます。

"Hello World!".startsWith("He"); // true

var haystack = "Hello world";
var prefix = 'orl';
haystack.startsWith(prefix); // false

@gtournieなぜ、startsWithは、文字列が文字列で始まるかどうかをテストするための最悪の方法の1つでしょうか?(ここのコメントを参照してください:stackoverflow.com/questions/646628/…)1文字ごとに文字を比較する方が熱心です。コンパイラーがすべてのstring [index]の文字列を生成しないほどスマートであることを願っています。これを書くだけの場合、文字= string [0]はオブジェクトを割り当てるため、startsWithを使用するよりも無限に効率的です(startsWithはメモリを割り当てません) )
Martijn Scheffer 2016

@MartijnScheffer:私が返信して以来、回答は何度も編集され、現在は完全に異なります(コメントを削除しました;)。ECMAScript 6のstartsWithメソッドがそのための最良の方法であることに同意します。
gtournie 2016

6
@GrahamLaight、「IE」でサポートされていると言うと、おそらくEdgeを意味します。developer.mozilla.org/en/docs/Web/JavaScript/Reference/…–
Marcus

@マーカス、私が間違っていたことをお詫びします-私の情報は次の場所
Graham Laight

警告!これらのjsperfテストは、JITコンパイルに優れたブラウザでは機能しません。FirefoxやChromeなどのブラウザは、操作の結果が破棄されたときにそれを認識して、操作を実行しない場合があります。それとは別に、最新のJavaScriptエンジンは分岐予測を使用するため、テスト文字列は反復ごとに異なる必要があります。
Aloso

1283

別の代替.lastIndexOf

haystack.lastIndexOf(needle, 0) === 0

これはを通じて後方に見えるhaystackの発生のためのneedleインデックスから始まる0haystack。つまり、でhaystack始まるかどうかだけをチェックしneedleます。

原則として、これは他のいくつかのアプローチよりもパフォーマンス上の利点があるはずです。

  • 全体を検索するわけではありませんhaystack
  • 新しい一時的な文字列は作成されず、すぐに破棄されます。

1
@ rfcoder89がどのケースをとっているのかわからない-jsfiddle.net/jkzjw3w2/1
Gulfaraz Rahman '20

5
@ rfcoder89 lastIndexOf:の2番目のパラメーターは"aba".lastIndexOf ("a")、指摘したとおり2です"aba".lastIndexOf ("a", 0)が、0であることに
注意してください

1
どうもありがとうございます。String.startsWithはAndroid lollipop WebViewでは機能しませんが、このlastIndexOfスニペットでは機能します!!!
ハーマン、

lastIndexOfそれは文字列全体を検索するように文字列を先頭に終わりから検索する:その非効率性はで検索するには非常に長い文字列のために成長するようにします。
ウィリーウォンカ

8
@willywonkaいいえ、startIndexが0の場合ではなく、0位置から検索され、それが唯一のチェックです。文字列全体が検索されるのは、fromIndex> = str.lengthの場合のみです。

588
data.substring(0, input.length) === input

3
@ANevesブラウザーと使用するデータに強く依存していると思います。実際の測定については、Ben Weaverの回答を参照してください。私が現在実行しているブラウザー(WindowsのChrome 12.0.742)では、部分文字列が成功し、準備済みの正規表現が失敗します。
cobbal 2011

4
@cobbalたぶん。しかし.lastIndexOf(input, 0)、最初のN文字を比較しますが、Nを.substring(0, input.length) === inputカウントし、データをN文字列にサブストリング化してから、それらのN文字を比較します。コードの最適化がない限り、この2番目のバージョンは他のバージョンよりも速くなることはできません。誤解しないでください。あなたが提案したよりも良いものを自分で見つけることはできません。:)
ANeves

2
@ANevesしかし、falseを返す長い文字列の.lastIndexOfは文字列全体(O(N))を反復しますが、.substringのケースは潜在的にはるかに小さい文字列を反復します。大多数の成功または小さな入力のみが予想される場合は、.lastIndexOfの方が速い可能性があります。そうでない場合は、.substringの方が速い可能性があります。.substringは、入力がチェック対象の文字列よりも長い場合にも例外が発生するリスクがあります。
Chris Moschini、2013年

14
@ ChrisMoschini、Mark ByersのソリューションがlastIndexOfインデックスではなく、インデックス0から始まっていることを忘れないでください。それも最初は私をつまずかせました。それでも、文字列が何で始まるかを確認することは、JavaScriptが実際に適切なAPIを備えている必要がある一般的なタスクであり、このページに表示されるすべてのイディオムや代替手段ではありません。
Randall Cook

4
マークのソリューションよりもコバルのソリューションの方が好きです。markの方が速く、paramsを使用した印象的なトリックであったとしても、サブストリングと比較して読むのは非常に困難です。
ThinkBonobo、2015

184

ヘルパー関数なしで、正規表現の.test方法を使用するだけです:

/^He/.test('Hello world')

ハードコードされた文字列ではなく動的文字列を使用してこれを行うには(文字列に正規表現制御文字が含まれていないと仮定):

new RegExp('^' + needle).test(haystack)

あなたは、チェックアウトする必要がありますJavaScriptでRegExp.escape機能はありますか?文字列に正規表現制御文字が含まれている可能性がある場合。


1
式で大文字と小文字を区別するため/^he/i
kaizer1v 2018年

64

最適なソリューション:

function startsWith(str, word) {
    return str.lastIndexOf(word, 0) === 0;
}

そして、これも必要な場合は、endsWithです:

function endsWith(str, word) {
    return str.indexOf(word, str.length - word.length) !== -1;
}

それを文字列にプロトタイプすることを好む人のために:

String.prototype.startsWith || (String.prototype.startsWith = function(word) {
    return this.lastIndexOf(word, 0) === 0;
});

String.prototype.endsWith   || (String.prototype.endsWith = function(word) {
    return this.indexOf(word, this.length - word.length) !== -1;
});

使用法:

"abc".startsWith("ab")
true
"c".ensdWith("c") 
true

メソッドあり:

startsWith("aaa", "a")
true
startsWith("aaa", "ab")
false
startsWith("abc", "abc")
true
startsWith("abc", "c")
false
startsWith("abc", "a")
true
startsWith("abc", "ba")
false
startsWith("abc", "ab")
true

関数でlastIndexOfとindexOfを混同していると思います-startsWithはstr.indexOf(word、0)=== 0を返す必要があります。
Richard Matheson

5
@RichardMatheson indexOfを使用する場合の問題は、最初に一致しなかった場合、文字列全体の検索を続行し、lastIndexOfが単語の長さから始まり、ゼロに戻ります。とった?
mmm 2017年

2
ああ、はい、理にかなっています-私はあなたが使っていたインデックスに注意を払いませんでした。とても素敵なトリック!
Richard Matheson

54

私はこれについて私の意見を追加したかっただけです。

私たちはこのように使用できると思います:

var haystack = 'hello world';
var needle = 'he';

if (haystack.indexOf(needle) == 0) {
  // Code if string starts with this substring
}

2
Mark Byersの回答は、@ relforによって3つの異なる正しいアプローチのパフォーマンスについて比較されました。文字列全体を検索する必要があるため、この正しいアプローチは好ましくありませんでした。
maxpolk 2016年

@maxpolk indexOf最初に出現した文字列全体の検索を停止すると思います。確認しました。
Mr.D 2016年

8
最初の出現が最初に見つからない場合、このアプローチは、探し続ける時間が長くなるほど非効率的になり始めます。かなり早く終了するのではなく、最後まで到達するまで検索する可能性があります。非効率になる可能性があるため、3つの正しいアプローチの中でそれは好ましくありません。
maxpolk 2016年

2
@ Mr.Dそして一致がない場合はどうなりますか?
mmm

他に、干し草の山がすべて検索されたときは?優れています:stackoverflow.com/a/36876507/961018 ..語長までの​​検索のみ
mmm

39

CMSのソリューションのマイナーな改善は次のとおりです。

if(!String.prototype.startsWith){
    String.prototype.startsWith = function (str) {
        return !this.indexOf(str);
    }
}

"Hello World!".startsWith("He"); // true

 var data = "Hello world";
 var input = 'He';
 data.startsWith(input); // true

将来のブラウザーがネイティブコードで実装する場合、または別のライブラリーによって実装される場合に備えて、関数がすでに存在するかどうかを確認します。たとえば、プロトタイプライブラリはこの関数をすでに実装しています。

読み!やすさは劣りますが、使用する方が少し高速で簡潔です=== 0


1
これは問題になる可能性があります。すでに実装されている実装の動作が自分のものと異なる場合、これはアプリケーションを破壊します。
クリストフワーム

2
これは、Oは(N)の問題は、ここで議論しているstackoverflow.com/questions/646628/javascript-startswith/...
クリスMoschini

1
を使用して!非常に厄介です
JonnyRaa

-1; これをに追加することString.prototypeは悪い考えです。というのも、の仕様に準拠することはできないからですString.prototype.startsWith。ES6メソッドを使用しようとするコードは、これを実行すると失敗する可能性があります。メソッドが既に定義されているかどうかを確認し、それが(悪いことに)仕様に準拠しており、仕様に準拠したシムを追加していないことを確認すると、後で不正な動作が発生します。
Mark Amery 2015年

21

underscore.string.jsも確認してください。メソッドを含む、便利な文字列のテストと操作のメソッドがたくさん付属していstartsWithます。ドキュメントから:

startsWith _.startsWith(string, starts)

このメソッドは、でstring始まるかどうかを確認しstartsます。

_("image.gif").startsWith("image")
=> true

1
必要だった_.string.startsWith
パニック大佐14

15

最近同じ質問をしました。
考えられる解決策は複数ありますが、有効な解決策は3つあります。

  • s.indexOf(starter) === 0
  • s.substr(0,starter.length) === starter
  • s.lastIndexOf(starter, 0) === 0(Mark Byersの回答を見た後に追加)
  • ループを使用:

    function startsWith(s,starter) {
      for (var i = 0,cur_c; i < starter.length; i++) {
        cur_c = starter[i];
        if (s[i] !== starter[i]) {
          return false;
        }
      }
      return true;
    }

ループを使用する最後の解決策に遭遇していません。
驚くべきことに、このソリューションは最初の3つを大幅に上回っています。
ここで私はこの結論に到達するために行わjsperfテストは次のとおりです。http://jsperf.com/startswith2/2

平和

ps:ecmascript 6(調和)は、startsWith文字列のネイティブメソッドを導入します。
初期バージョン自体にこの非常に必要なメソッドを含めることを考えていたら、どれだけの時間を節約できたと思いますか。

更新

Steveが指摘したように(この回答の最初のコメント)、上記のカスタム関数は、指定されたプレフィックスが文字列全体よりも短い場合にエラーをスローします。彼はそれを修正し、http://jsperf.com/startswith2/4で表示できるループ最適化を追加しました。

Steveが組み込んだ2つのループ最適化があることに注意してください。2つのうちの最初のループはより優れたパフォーマンスを示したため、以下のコードを投稿します。

function startsWith2(str, prefix) {
  if (str.length < prefix.length)
    return false;
  for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i)
    continue;
  return i < 0;
}

最新のリビジョンを参照してください。上記のバージョンのバグ(文字列がプレフィックスよりも短い場合にスローされます)に加えて、より最適化されたバージョンよりも遅くなります。jsperf.com/startswith2/4およびjsperf.com/js-startswith/35を参照してください。
Steve Hollasch、2014

^文字列がプレフィックスよりも短いケースを指摘してくれてありがとう
Raj Nathani '29

jsperf.com/startswith2/29 => startsWith5は簡潔で、非常に優れています=)
gtournie

11

これは非常に人気があるので、ECMA 6にこのメソッドの実装があり、その準備として、将来の問題や涙を防ぐために「公式」ポリフィルを使用する必要があることを指摘する価値があると思います。

幸いなことに、Mozillaの専門家は次のいずれかを提供します。

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith

if (!String.prototype.startsWith) {
    String.prototype.startsWith = function(searchString, position) {
        position = position || 0;
        return this.indexOf(searchString, position) === position;
    };
}

これにはECMA 6への移行時に優雅に無視されるという利点があることに注意してください。


5

最高のパフォーマンスのソリューションは、ライブラリ呼び出しの使用を停止し、2つの配列で作業していることを認識することです。手作業での実装は、ここで見た他のどのソリューションよりも短く、高速です。

function startsWith2(str, prefix) {
    if (str.length < prefix.length)
        return false;
    for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i)
        continue;
    return i < 0;
}

パフォーマンスの比較(成功と失敗)については、http://jsperf.com/startswith2/4を参照してください。(私のものを踏みにじった可能性のあるそれ以降のバージョンを確認してください。)


2

私はこの文字列ライブラリについてちょうど学んだ:

http://stringjs.com/

jsファイルをインクルードし、次のSように変数を使用します。

S('hi there').endsWith('hi there')

NodeJSをインストールして使用することもできます。

npm install string

次に、それをS変数として要求します。

var S = require('string');

Webページには、代替の文字列ライブラリへのリンクもあります(これが気に入らない場合)。


2
  1. 質問は少し古いですが、ここで提供されたすべての回答とJim Buckによって共有されたjsperfに基づいて作成したいくつかのベンチマークを示すために、この回答を書きたかったのです。

基本的に、長い針が長い干し草の山の中にあるかどうかを見つけるための高速な方法が必要でしたが、最後の文字を除いて非常に似ています。

これが私が書いたコードで、各関数(splice、substring、startsWithなど)が1.000.0001文字のhaystack文字列(nestedString)と1.000.000の偽または真の針文字列に対してfalseとtrueを返す場合の両方をテストします。文字(testParentStringFalseおよびtestParentStringTrue、それぞれ):

// nestedString is made of 1.000.001 '1' repeated characters.
var nestedString = '...'

// testParentStringFalse is made of 1.000.000 characters,
// all characters are repeated '1', but the last one is '2',
// so for this string the test should return false.
var testParentStringFalse = '...'

// testParentStringTrue is made of 1.000.000 '1' repeated characters,
// so for this string the test should return true.
var testParentStringTrue = '...'

// You can make these very long strings by running the following bash command
// and edit each one as needed in your editor
// (NOTE: on OS X, `pbcopy` copies the string to the clipboard buffer,
//        on Linux, you would probably need to replace it with `xclip`):
// 
//     printf '1%.0s' {1..1000000} | pbcopy
// 

function testString() {
    let dateStart
    let dateEnd
    let avg
    let count = 100000
    const falseResults = []
    const trueResults = []

    /* slice */
    console.log('========> slice')
    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.slice(0, testParentStringFalse.length) === testParentStringFalse
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    falseResults[falseResults.length] = {
        label: 'slice',
        avg
    }
    console.log(`testString() slice = false`, res, 'avg: ' + avg + 'ms')

    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.slice(0, testParentStringTrue.length) === testParentStringTrue
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    trueResults[trueResults.length] = {
        label: 'slice',
        avg
    }
    console.log(`testString() slice = true`, res, 'avg: ' + avg + 'ms')
    console.log('<======== slice')
    console.log('')
    /* slice END */

    /* lastIndexOf */
    console.log('========> lastIndexOf')
    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.lastIndexOf(testParentStringFalse, 0) === 0
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    falseResults[falseResults.length] = {
        label: 'lastIndexOf',
        avg
    }
    console.log(`testString() lastIndexOf = false`, res, 'avg: ' + avg + 'ms')

    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.lastIndexOf(testParentStringTrue, 0) === 0
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    trueResults[trueResults.length] = {
        label: 'lastIndexOf',
        avg
    }
    console.log(`testString() lastIndexOf = true`, res, 'avg: ' + avg + 'ms')
    console.log('<======== lastIndexOf')
    console.log('')
    /* lastIndexOf END */

    /* indexOf */
    console.log('========> indexOf')
    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.indexOf(testParentStringFalse) === 0
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    falseResults[falseResults.length] = {
        label: 'indexOf',
        avg
    }
    console.log(`testString() indexOf = false`, res, 'avg: ' + avg + 'ms')

    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.indexOf(testParentStringTrue) === 0
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    trueResults[trueResults.length] = {
        label: 'indexOf',
        avg
    }
    console.log(`testString() indexOf = true`, res, 'avg: ' + avg + 'ms')
    console.log('<======== indexOf')
    console.log('')
    /* indexOf END */

    /* substring */
    console.log('========> substring')
    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.substring(0, testParentStringFalse.length) === testParentStringFalse
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    falseResults[falseResults.length] = {
        label: 'substring',
        avg
    }
    console.log(`testString() substring = false`, res, 'avg: ' + avg + 'ms')

    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.substring(0, testParentStringTrue.length) === testParentStringTrue
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    trueResults[trueResults.length] = {
        label: 'substring',
        avg
    }
    console.log(`testString() substring = true`, res, 'avg: ' + avg + 'ms')
    console.log('<======== substring')
    console.log('')
    /* substring END */

    /* startsWith */
    console.log('========> startsWith')
    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.startsWith(testParentStringFalse)
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    falseResults[falseResults.length] = {
        label: 'startsWith',
        avg
    }
    console.log(`testString() startsWith = false`, res, 'avg: ' + avg + 'ms')

    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.startsWith(testParentStringTrue)
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    trueResults[trueResults.length] = {
        label: 'startsWith',
        avg
    }
    console.log(`testString() startsWith = true`, res, 'avg: ' + avg + 'ms')
    console.log('<======== startsWith')
    console.log('')
    /* startsWith END */

    falseResults.sort((a, b) => a.avg - b.avg)
    trueResults.sort((a, b) => a.avg - b.avg)

    console.log('false results from fastest to slowest avg:', falseResults)
    console.log('true results from fastest to slowest avg:', trueResults)
}

私はこのベンチマークテストをChrome 75Firefox 67Safari 12Opera 62で実行しました

EdgeとIEはこのマシンにないため含めていませんが、誰かがEdgeと少なくともIE 9に対してスクリプトを実行し、ここで出力を共有したい場合は、結果を確認したいと思います。

3つの長い文字列を再作成し、スクリプトをファイルに保存する必要があることを覚えておいてください。その後、ブラウザのコンソールにコピー/貼り付けすると、各文字列の長さが1.000.000以上になるためブロックされます。

出力は次のとおりです。

Chrome 75(substring勝利):

false results from fastest to slowest avg:
1)  {"label":"substring","avg":0.08271}
2)  {"label":"slice","avg":0.08615}
3)  {"label":"lastIndexOf","avg":0.77025}
4)  {"label":"indexOf","avg":1.64375}
5)  {"label":"startsWith","avg":3.5454}

true results from fastest to slowest avg:
1)  {"label":"substring","avg":0.08213}
2)  {"label":"slice","avg":0.08342}
3)  {"label":"lastIndexOf","avg":0.7831}
4)  {"label":"indexOf","avg":0.88988}
5)  {"label":"startsWith","avg":3.55448}

Firefox 67(indexOf勝利):

false results from fastest to slowest avg
1)  {"label":"indexOf","avg":0.1807}
2)  {"label":"startsWith","avg":0.74621}
3)  {"label":"substring","avg":0.74898}
4)  {"label":"slice","avg":0.78584}
5)  {"label":"lastIndexOf","avg":0.79668}

true results from fastest to slowest avg:
1)  {"label":"indexOf","avg":0.09528}
2)  {"label":"substring","avg":0.75468}
3)  {"label":"startsWith","avg":0.76717}
4)  {"label":"slice","avg":0.77222}
5)  {"label":"lastIndexOf","avg":0.80527}

Safari 12(slice誤った結果が出た場合はstartsWith勝ち、真の結果が出た場合は勝ちます。また、Safariは、テスト全体を実行する合計時間の点で最速です):

false results from fastest to slowest avg:
1) "{\"label\":\"slice\",\"avg\":0.0362}"
2) "{\"label\":\"startsWith\",\"avg\":0.1141}"
3) "{\"label\":\"lastIndexOf\",\"avg\":0.11512}"
4) "{\"label\":\"substring\",\"avg\":0.14751}"
5) "{\"label\":\"indexOf\",\"avg\":0.23109}"

true results from fastest to slowest avg:
1) "{\"label\":\"startsWith\",\"avg\":0.11207}"
2) "{\"label\":\"lastIndexOf\",\"avg\":0.12196}"
3) "{\"label\":\"substring\",\"avg\":0.12495}"
4) "{\"label\":\"indexOf\",\"avg\":0.33667}"
5) "{\"label\":\"slice\",\"avg\":0.49923}"

Opera 62(substring勝つ。結果はChromeに似ており、OperaはChromiumとBlinkをベースにしているので私は驚かない):

false results from fastest to slowest avg:
{"label":"substring","avg":0.09321}
{"label":"slice","avg":0.09463}
{"label":"lastIndexOf","avg":0.95347}
{"label":"indexOf","avg":1.6337}
{"label":"startsWith","avg":3.61454}

true results from fastest to slowest avg:
1)  {"label":"substring","avg":0.08855}
2)  {"label":"slice","avg":0.12227}
3)  {"label":"indexOf","avg":0.79914}
4)  {"label":"lastIndexOf","avg":1.05086}
5)  {"label":"startsWith","avg":3.70808}

すべてのブラウザが独自の実装の詳細を持っていることがわかります(ChromeのChromiumおよびBlinkに基づくOperaは別として)。

もちろん、さまざまなユースケースでさらにテストを実行できます(たとえば、haystackと比較して針が本当に短い場合、haystackがneedleよりも短い場合など)。しかし、私の場合、非常に長い文字列とここでそれを共有したかった。


1
var str = 'hol';
var data = 'hola mundo';
if (data.length >= str.length && data.substring(0, str.length) == str)
    return true;
else
    return false;

0

ここでの回答に基づいて、これは私が現在使用しているバージョンです。これは、JSperfテストに基づいて最高のパフォーマンスを提供するようです(そして、私が知る限り機能的に完全です)。

if(typeof String.prototype.startsWith != 'function'){
    String.prototype.startsWith = function(str){
        if(str == null) return false;
        var i = str.length;
        if(this.length < i) return false;
        for(--i; (i >= 0) && (this[i] === str[i]); --i) continue;
        return i < 0;
    }
}

これは、http://jsperf.com/startswith2/6のstartsWith2に基づいていました。小さなパフォーマンス改善のために小さな調整を追加し、それ以降、比較文字列がnullまたは未定義であるかどうかのチェックも追加し、CMSの回答の手法を使用して文字列プロトタイプに追加するように変換しました。

この実装は、このMozilla Developer Networkページに記載されている「position」パラメーターをサポートしていませんが、いずれにしてもECMAScript提案の一部ではないようです。


0

私はjavascriptについて確信がありませんが、typescriptでは私は次のようなことをしました

var str = "something";
(<String>str).startsWith("some");

jsでも動作するはずです。お役に立てば幸いです。


-2

あなたが作業している場合startsWith()endsWith()、あなたは、先頭のスペースについて注意する必要があります。以下に完全な例を示します。

var str1 = " Your String Value Here.!! "; // Starts & ends with spaces    
if (str1.startsWith("Your")) { }  // returns FALSE due to the leading spaces…
if (str1.endsWith("Here.!!")) { } // returns FALSE due to trailing spaces…

var str2 = str1.trim(); // Removes all spaces (and other white-space) from start and end of `str1`.
if (str2.startsWith("Your")) { }  // returns TRUE
if (str2.endsWith("Here.!!")) { } // returns TRUE

3
これは非常に非標準的な動作です。文字列 "abc"は "abc"で始まりません。より具体的には、ECMA 6は文字列のトリミングを一切想定していないため、startsWith一致を生成するには空白が正確に一致する必要があります。
Steve Hollasch、2014

3
何...これが質問にどのように答えているのですか?
DCシャノン2015年

1
@DCShannonではありません。それは理解できないナンセンスです。
Mark Amery

2
@SteveHollasch私の意図は、私が直面した同じ問題を探している人に気づくことでした。関数startsWith()endsWith()関数を使用する場合は、先頭のスペースに注意する必要があります。他には何もない!
immayankmodi 2015年

-3

配列プロトタイプへの独自のプロトタイプ/拡張を作成することにより、文字列で始まる配列のすべてのメンバーを返すこともできます。

Array.prototype.mySearch = function (target) {
    if (typeof String.prototype.startsWith != 'function') {
        String.prototype.startsWith = function (str){
        return this.slice(0, str.length) == str;
      };
    }
    var retValues = [];
    for (var i = 0; i < this.length; i++) {
        if (this[i].startsWith(target)) { retValues.push(this[i]); }
    }
    return retValues;
};

そしてそれを使うには:

var myArray = ['Hello', 'Helium', 'Hideout', 'Hamster'];
var myResult = myArray.mySearch('Hel');
// result -> Hello, Helium
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.