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

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

haystack.startsWith(needle) == true

注意:这是一个老问题,正如ECMAScript 2015(ES6)在评论中指出的那样,引入了.startsWith方法。然而,在编写此更新(2015年)时,浏览器支持还远未完成。


当前回答

最好的性能解决方案是停止使用库调用,只需认识到您使用的是两个阵列。手动实现既短又快,比我在这里看到的其他解决方案都快。

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.(确保您检查了可能胜过我的更高版本。)

其他回答

我刚刚了解了这个字符串库:

http://stringjs.com/

包括js文件,然后像这样使用S变量:

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

它也可以通过安装在NodeJS中使用:

npm install string

然后要求它作为S变量:

var S = require('string');

如果你不喜欢这个字符串库的话,这个网页也有指向其他字符串库的链接。

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

我想我们可以这样使用:

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

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

您还可以通过创建自己的原型/扩展名来返回以字符串开头的数组的所有成员

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

使用.lastIndexOf的另一种选择:

haystack.lastIndexOf(needle) === 0

这将在干草堆中向后查看针的出现情况,从干草堆的索引字符串长度开始返回到零。换句话说,它只检查大海捞针是否开始。lastIndexOf提供了第二个可选参数“fromIndex”。如果给定,则反向搜索从该给定索引位置开始,并返回索引零。但是我们不能指定除最后一个索引之外的任何其他fromIndex,否则搜索可能会忽略某些内容。

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

它不会搜索整个干草堆。它不会创建新的临时字符串,然后立即丢弃它。

以下是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稍快且更简洁,但不可读。