如何在JavaScript中编写与C#的String.StartsWith等效的代码?
var haystack = 'hello world';
var needle = 'he';
haystack.startsWith(needle) == true
注意:这是一个老问题,正如ECMAScript 2015(ES6)在评论中指出的那样,引入了.startsWith方法。然而,在编写此更新(2015年)时,浏览器支持还远未完成。
如何在JavaScript中编写与C#的String.StartsWith等效的代码?
var haystack = 'hello world';
var needle = 'he';
haystack.startsWith(needle) == true
注意:这是一个老问题,正如ECMAScript 2015(ES6)在评论中指出的那样,引入了.startsWith方法。然而,在编写此更新(2015年)时,浏览器支持还远未完成。
当前回答
我最近问了自己同样的问题。有多种可能的解决方案,以下是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;
}
其他回答
最好的性能解决方案是停止使用库调用,只需认识到您使用的是两个阵列。手动实现既短又快,比我在这里看到的其他解决方案都快。
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.(确保您检查了可能胜过我的更高版本。)
我最近问了自己同样的问题。有多种可能的解决方案,以下是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;
}
var str = 'hol';
var data = 'hola mundo';
if (data.length >= str.length && data.substring(0, str.length) == str)
return true;
else
return false;
最佳解决方案:
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
还可以查看underscore.string.js。它提供了一系列有用的字符串测试和操作方法,包括startsWith方法。从文档中:
startsWith_.startsWith(字符串,开始)此方法检查字符串是否以start开头。_(“image.gif”).startsWith(“image”)=>真