如何检查字符串“ StartsWith”是否为另一个字符串?


1690

我将如何String.StartsWith在JavaScript中编写等效于C#的代码?

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

haystack.startsWith(needle) == true

注意:这是一个古老的问题,正如注释ECMAScript 2015(ES6)中指出的那样,介绍了该.startsWith方法。但是,在撰写此更新(2015)时,浏览器支持还远远没有完成

Answers:


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用作测试字符串是否以字符串开头的最差方法之一?(请参阅此处的评论:stackoverflow.com/questions/646628/…),您比较热衷于比较每个字符。我希望编译器足够聪明,不要为每个string [index]生成一个字符串,因为,如果您简单地编写以下代码:character = string [0]它将分配一个对象,这绝对比使用startsWith(startsWith将不会分配任何内存少) )
Martijn Scheffer

@MartijnScheffer:自从我回答以来,答案已经被编辑了很多次,现在已经完全不同了(我删除了评论;)。我同意ECMAScript 6的startsWith方法是执行此操作的最佳方法。
gtournie

6
@GrahamLaight,当您说受“ IE”支持时,大概是指Edge。developer.mozilla.org/en/docs/Web/JavaScript/Reference/…–
Marcus

@Marcus,如果我错了,我深表歉意-我的信息来自:w3schools.com/jsref/jsref_startswith.asp
Graham Laight

警告!这些jsperf测试无法在擅长JIT编译的浏览器中使用。诸如Firefox和Chrome之类的浏览器有时会在放弃操作结果时识别出它,因此不执行该操作。除此之外,现代的javascript引擎还使用分支预测,因此测试字符串在每次迭代中都应不同。
Aloso

1282

另一种选择是.lastIndexOf

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

这看起来向后通过haystack为的发生needle,从指数开始0haystack。换句话说,它仅检查是否haystack以开头needle

原则上,与其他方法相比,这应该具有性能优势:

  • 它不会搜索整个haystack
  • 它不会创建新的临时字符串,然后立即将其丢弃。

1
不确定@ rfcoder89发生哪种情况-jsfiddle.net/jkzjw3w2/1
Gulfaraz Rahman

5
@ rfcoder89请注意"aba".lastIndexOf ("a"),您指出的lastIndexOf:的第二个参数为2,但"aba".lastIndexOf ("a", 0)为0,这是正确的
maxpolk

1
非常感谢。String.startsWith在Android棒棒糖WebView上不起作用,但是此lastIndexOf片段可以!!!
赫尔曼

lastIndexOf的字符串是从年底开始,因此搜索整个字符串搜索:所以它的低效率的增长非常长的字符串中搜索。
威利·旺卡

8
@willywonka不,如果您的startIndex为0,则不是这样,它是从0 pos搜索的,这是唯一的检查。仅当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个字符,而.substring(0, input.length) === input计数N,则将数据子串化为N个长度,然后比较这N个字符。除非进行代码优化,否则第二个版本不能比另一个版本快。不过请不要误解我,我自己也找不到比您建议的更好的东西。:)
ANeves 2011年

2
@ANeves但是,要返回false的长字符串上的.lastIndexOf将遍历整个字符串(O(N)),而.substring情况将遍历可能较小的字符串。如果您期望多数成功或仅输入少量内容,则.lastIndexOf可能会更快-否则.substring可能会更快。如果输入的长度大于要检查的字符串,则.substring还会引发异常。
克里斯·莫斯基尼

14
@ChrisMoschini,不要忘记Mark Byers的解决方案lastIndexOf从索引0开始,而不是结束。一开始,那也使我震惊。尽管如此,检查字符串的开头是一项常见的任务,JavaScript确实应该为此提供适当的API,而不是您在此页面上看到的所有惯用法和替代方法,无论它们多么聪明。
兰德尔·库克

4
我更喜欢cobbal的解决方案而不是Mark的解决方案。即使mark的速度更快,并且使用params是一个令人印象深刻的技巧,但与子字符串相比,它还是很难阅读的。
ThinkBonobo

183

没有辅助函数,仅使用正则表达式的.test方法:

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

为此,请使用动态字符串而不是硬编码的字符串(假设该字符串将不包含任何正则表达式控制字符):

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

您应该检查一下Java中是否存在RegExp.escape函数?如果有可能在字符串中出现正则表达式控制字符。


1
为了使表达式区分大小写,请使用/^he/i
kaizer1v '18

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的用户:

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;
理查德·马西森

5
@RichardMatheson使用indexOf的问题是,如果在开始时匹配失败,它将继续搜索整个字符串,从而lastIndexOf从单词的长度开始,然后返回零。得到它了?
毫米

2
嗯,是的,现在很有意义-我没有注意您使用的索引。很不错的把戏!
理查德·马西森

54

我只是想补充一下我的看法。

我认为我们可以这样使用:

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

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

2
@relfor比较了Mark Byers答案对三种不同正确方法的性能。这种正确的方法不受欢迎,因为它需要搜索整个字符串。
maxpolk '16

我认为@maxpolk indexOf在发现首次出现时将停止搜索整个字符串。我已经检查过了
D先生

8
如果在开始时未找到第一次出现的情况,则此方法持续寻找的时间越长,其效率就会开始变得越来越低,可能会一直搜索到到达末尾,而不是更早地放弃。由于存在效率低下的可能性,因此在三种正确的方法中均不建议使用此方法。
maxpolk

2
@ Mr.D如果没有匹配项?
毫米

否则,当所有干草堆都被搜索到了吗?更好: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
这可能会成为一个问题:如果已经实现的实现与我自己的实现有所不同,则这将破坏我的应用程序。
Christoph Wurm


1
使用!非常混乱
JonnyRaa 2015年

-1; 加上这String.prototype是一个坏主意,因为它并不难望其项背与符合规范String.prototype.startsWith。如果这样做,任何尝试使用ES6方法的代码都可能会失败;它很可能会查看该方法是否已定义,是否(严重)由您定义,并且未添加符合规范的填充程序,从而导致稍后出现错误行为。
Mark Amery

21

还要查看underscore.string.js。它附带了一堆有用的字符串测试和操作方法,包括一个startsWith方法。从文档:

以。。开始 _.startsWith(string, starts)

此方法检查是否string以开头starts

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

1
我需要_.string.startsWith
Panic Panic

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;
    }

我还没有遇到使用循环的最后一个解决方案。
出人意料的是,该解决方案的性能大大优于前三个。
这是我为了得出此结论而执行的jsperf测试:http ://jsperf.com/startswith2/2

和平

ps:ecmascript 6(和声)引入了startsWith字符串的本机方法。
只需考虑一下,如果他们考虑将这种急需的方法包含在初始版本本身中,将节省多少时间。

更新资料

正如Steve指出的那样(此答案的第一条评论),如果给定的前缀短于整个字符串,则上述自定义函数将引发错误。他已修复此问题,并添加了循环优化功能,可以在http://jsperf.com/startswith2/4上进行查看。

请注意,Steve包括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/4jsperf.com/js-startswith/35
史蒂夫·霍拉斯

^感谢您指出字符串比前缀短的情况
Raj Nathani 2014年

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

性能最好的解决方案是停止使用库调用,而只是识别您正在使用两个数组。与我在这里看到的所有其他解决方案相比,手动实施的实现既简短又快捷。

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');

如果您不喜欢该网页,则该网页还具有指向其他字符串库的链接。


2
  1. 这个问题有点老了,但是我想写这个答案来向您展示我根据此处提供的所有答案以及Jim Buck共享的jsperf所做的一些基准测试。

我基本上需要一种快速的方法来查找长针堆中是否有长针,除了最后一个字符外,它们非常相似。

这是我编写的代码,对于每个函数(splice,substring,startsWith等),它们针对干草堆字符串(nestedString)1.000.0001个字符和虚假或真实的针串1.000.000 返回false和true时均进行测试字符(testParentStringFalsetestParentStringTrue,分别为):

// 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}

事实证明,每个浏览器都有自己的实现细节(Opera,它基于Chrome的Chromium和Blink)。

当然,可以并且应该在不同的用例下进行进一步的测试(例如,当针比干草堆短时,当干草堆比针短时,等等),但是在我的情况下,我需要比较长的字符串和想在这里分享。


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;
    }
}

它基于以下位置的startsWith2:http : //jsperf.com/startswith2/6。我添加了一个小的调整以改善性能,此后还添加了对比较字符串是否为null或undefined的检查,并使用CMS的答案中的技术将其转换为String原型。

请注意,此实现不支持此Mozilla开发人员网络页面中提到的“ position”参数,但无论如何它似乎都不是ECMAScript提议的一部分。


0

我不确定使用JavaScript,但在打字稿中我做了类似的事情

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匹配。
史蒂夫·霍拉斯

3
什么...这如何回答问题?
DCShannon

1
@DCShannon不是。这真是胡说八道。
马克·阿默里

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.