如何在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年)时,浏览器支持还远未完成。
当前回答
根据这里的答案,这是我现在使用的版本,因为它似乎基于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.我添加了一个小的调整,以实现微小的性能改进,此后还添加了一项检查,以检查比较字符串是否为空或未定义,并使用CMS答案中的技术将其转换为添加到字符串原型中。
注意,这个实现不支持Mozilla开发者网络页面中提到的“position”参数,但这似乎并不是ECMAScript建议的一部分。
其他回答
使用.lastIndexOf的另一种选择:
haystack.lastIndexOf(needle) === 0
这将在干草堆中向后查看针的出现情况,从干草堆的索引字符串长度开始返回到零。换句话说,它只检查大海捞针是否开始。lastIndexOf提供了第二个可选参数“fromIndex”。如果给定,则反向搜索从该给定索引位置开始,并返回索引零。但是我们不能指定除最后一个索引之外的任何其他fromIndex,否则搜索可能会忽略某些内容。
原则上,这应该比其他一些方法具有性能优势:
它不会搜索整个干草堆。它不会创建新的临时字符串,然后立即丢弃它。
根据这里的答案,这是我现在使用的版本,因为它似乎基于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.我添加了一个小的调整,以实现微小的性能改进,此后还添加了一项检查,以检查比较字符串是否为空或未定义,并使用CMS答案中的技术将其转换为添加到字符串原型中。
注意,这个实现不支持Mozilla开发者网络页面中提到的“position”参数,但这似乎并不是ECMAScript建议的一部分。
我只是想补充一下我对此的看法。
我想我们可以这样使用:
var haystack = 'hello world';
var needle = 'he';
if (haystack.indexOf(needle) == 0) {
// Code if string starts with this substring
}
我不确定javascript,但在typescript中我做了类似的事情
var str = "something";
(<String>str).startsWith("some");
我想它应该也适用于js。我希望这有帮助!
最佳解决方案:
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