【问题标题】:Check if string begins with something? [duplicate]检查字符串是否以某些东西开头? [复制]
【发布时间】:2010-12-18 13:02:42
【问题描述】:

我知道我可以像 ^= 一样查看 id 是否以某些东西开头,我尝试使用它来做这个,但它没有用。基本上,我正在检索一个 URL,并且我想为以某种方式开始的路径名称的元素设置一个类。

例子:

var pathname = window.location.pathname;  //gives me /sub/1/train/yonks/459087

我想确保对于以/sub/1 开头的每个路径,我都可以为元素设置一个类:

if (pathname ^= '/sub/1') {  //this didn't work... 
        ... 

【问题讨论】:

  • /^\/sub\/1.*$/gi.test(pathname) 将返回一个布尔值作为谓词。
  • 如果您在 6 年后(作为我自己)来到这里,original & duplicated post Javascript StartsWith 提供了一个非常简洁的答案,使用 Ecmascript 6 startWith() 函数,这似乎具有最佳性能。
  • 或者从一个非常详细的讨论中详细阐述'回合性能和Thou shall not modify Objects not owned! - 可能是这样的? if (pathname.indexOf('/sub/1') === 0) {//Do.}

标签: javascript string match


【解决方案1】:

使用stringObject.substring

if (pathname.substring(0, 6) == "/sub/1") {
    // ...
}

【讨论】:

  • -1:创建一个额外的冗余字符串。
  • 这是一个测试用例:jsperf.com/starts-with/2。子字符串方法似乎是我机器上最快的(使用 V8)。
  • 这可以更通用,如下所示:var x = "/sub/1"; if (pathname.substring(0, x.length) === x) { // ... };。这样您就不再需要知道x 的长度,因为它可能会发生变化。
  • 创建一个新字符串,所以不太理想,最好的方法可能是使用charAt,如果charAt本身没有创建一个新字符串:)
  • 我会说值得注意的是它正在创建一个字符串,但我认为不值得投票,因为没有大量明显更好的选择,我敢打赌,在大多数情况下在这种情况下,冗余字符串的创建不会是一个值得担心的问题。
【解决方案2】:
String.prototype.startsWith = function(needle)
{
    return this.indexOf(needle) === 0;
};

【讨论】:

  • -1 在这里查看 cmets 有正当理由不使用这种类型的实现:stackoverflow.com/a/1978419/560287
  • 这是一个完美的答案(indexOf 事物),而不是被标记为答案的那个。
  • false的情况下,这个函数的性能取决于你要检查的字符串的长度,这不是这个用例的预期行为
  • 在我看来,这不是唯一正确的答案,而是在内存使用和速度方面最正确的答案。而且它也是可读的,但请记住不要修改您不拥有的对象(或者只是尽量避免它)。
  • 这是一种缓慢的方法,比较将在整个字符串中继续进行,如果这种方法被大量调用,我不会使用它。
【解决方案3】:

您也可以为此使用string.match() 和正则表达式:

if(pathname.match(/^\/sub\/1/)) { // you need to escape the slashes

string.match() 如果找到则返回匹配子串的数组,否则返回null

【讨论】:

  • 有没有办法在expr中动态插入一个url字符串?例如转义 url 中的 /?
  • @Tjorriemorrie 您可以使用 RegEx 类来完成此操作,例如 var reUrlTester = new RegEx(your_url_string); if(reUrlTester.test(url)) { // 使用测试函数查看 url 是否匹配。
  • @Cros Err,你打错了,这个类实际上是“RegExp”,所以应该是:var matcher = new RegExp(expected);if(matcher.test(actual)){ return true }
  • 虽然这可行,但如果不是绝对必要,请尽量避免使用 RegEx。 RegEx 函数比其等效的文字字符串函数慢,这只是一个显而易见的事实。事实上,一些官方文档网站实际上会告诉您尽可能避免使用它(例如,我认为 php.net 会这样做),速度要慢得多。我推荐 indexOf() 或 substr() 解决方案。
  • match 返回一个包含匹配字符串的数组,而不是匹配的字符串。见developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
【解决方案4】:

更多可重用的功能:

beginsWith = function(needle, haystack){
    return (haystack.substr(0, needle.length) == needle);
}

【讨论】:

    【解决方案5】:

    首先,让我们扩展字符串对象。感谢 Ricardo Peres 的原型,我认为使用变量 'string' 比使用 'needle' 在提高可读性方面效果更好。

    String.prototype.beginsWith = function (string) {
        return(this.indexOf(string) === 0);
    };
    

    然后你像这样使用它。警告!使代码具有极强的可读性。

    var pathname = window.location.pathname;
    if (pathname.beginsWith('/sub/1')) {
        // Do stuff here
    }
    

    【讨论】:

    • 没有真正添加任何东西。
    • 恕我直言 indexOf 如果在开头没有找到立即匹配的字符串,则搜索整个字符串:因此对于很长的字符串进行搜索,效率会越来越低。
    【解决方案6】:

    看看 JavaScript substring() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-04
      • 2022-11-29
      • 2016-09-17
      • 2011-02-16
      • 2018-12-27
      • 1970-01-01
      • 2012-02-09
      • 2012-02-06
      相关资源
      最近更新 更多