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

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

haystack.startsWith(needle) == true

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


当前回答

我不确定javascript,但在typescript中我做了类似的事情

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

我想它应该也适用于js。我希望这有帮助!

其他回答

我最近问了自己同样的问题。有多种可能的解决方案,以下是3种有效的解决方案:

s.indexOf(启动器)==0s.substr(0,starter.length)==启动器s.lastIndexOf(starter,0)==0(在看到Mark Byers的答案后添加)使用循环:函数startsWith(s,starter){对于(var i=0,cur_c;i<starter.length;i++){cur_c=启动器[i];如果(s[i]!==启动器[i]){return false;}}返回true;}

我还没有遇到使用循环的最后一个解决方案。令人惊讶的是,该解决方案以显著的优势优于前3个解决方案。下面是我为得出这个结论而执行的jsperf测试:http://jsperf.com/startswith2/2

和平

ps:ecmascript 6(harmony)为字符串引入了本机startsWith方法。试想一下,如果他们想到在初始版本中包含这个非常需要的方法,会节省多少时间。

使现代化

正如Steve所指出的(关于这个答案的第一条评论),如果给定的前缀短于整个字符串,上述自定义函数将抛出错误。他已经解决了这个问题,并添加了一个循环优化,可以在http://jsperf.com/startswith2/4.

请注意,Steve包含了两个循环优化,其中第一个显示了更好的性能,因此我将在下面发布代码:

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://stringjs.com/

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

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

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

npm install string

然后要求它作为S变量:

var S = require('string');

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

如果没有助手函数,只需使用regex的.test方法:

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

要使用动态字符串而不是硬编码字符串(假设字符串不包含任何正则表达式控制字符)执行此操作:

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

你应该看看Javascript中是否有RegExp.escape函数?如果存在正则表达式控制字符出现在字符串中的可能性。

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

我想我们可以这样使用:

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

if (haystack.indexOf(needle) == 0) {
  // Code if string starts with this substring
}
var str = 'hol';
var data = 'hola mundo';
if (data.length >= str.length && data.substring(0, str.length) == str)
    return true;
else
    return false;