Check if string begins with something?
Possible Duplicate:
Javascript StartsWith
号
我知道我可以像^=那样看一个ID是否以某个东西开头,我尝试将它用于此,但它不起作用…基本上,我正在检索URL,我想为以某种方式开始的路径名的元素设置一个类…
所以,
1
| var pathname = window.location.pathname; //gives me /sub/1/train/yonks/459087 |
我想确保对于以/sub/1开头的每个路径,我都可以为元素设置一个类…
1 2
| if(pathname ^= '/sub/1') { //this didn't work...
... |
号
- /^\/sub\/1.*$/gi.test(pathname)将返回一个布尔值作为谓词。
- 如果你6年后(像我一样)来到这里,最初的和复制的post-javascript starts提供了一个非常简洁的答案,使用ecmascript 6 startwith()函数,这似乎有最好的性能。
- 或者是从一个非常详细的讨论中,对性能和Thou shall not modify Objects not owned!进行详细的阐述——也许是这样的?埃多克斯1〔2〕
使用StringObject.SubString
1 2 3
| if (pathname.substring(0, 6) =="/sub/1") {
// ...
} |
- -1:创建一个额外的冗余字符串。
- 下面是这个的测试用例:jspef.com/starts-with/2。子字符串方法在我的机器上似乎是最快的(使用V8)。
- 这可以变得更通用,比如:var x ="/sub/1"; if (pathname.substring(0, x.length) === x) { // ... };。这样你就不再依赖于知道x的长度,因为它可能会改变。
- 创建一个新字符串,所以它不是理想的,如果charat本身不创建新字符串,最好的方法可能是使用charat:。
1 2 3 4
| String.prototype.startsWith = function(needle)
{
return this.indexOf(needle) === 0;
}; |
。
- -1请参阅此处的注释,了解不使用此类型实现的有效原因:stackoverflow.com/a/1978419/560287
- 这是一个完美的答案(事物的索引),而不是标记为答案的答案。
- 太糟糕了,我和@johnmagnolia在一起。使用正则表达式:/^\/sub\/1/。
- 在false的情况下,此函数的性能取决于要检查的字符串的长度,对于此用例,这不是预期的bahavior。
- 在我的观点中,不仅正确,而且在内存使用和速度方面是最正确的答案。它也是可读的,但请记住不要修改您不拥有的对象(或只是试图避免它)。
- 为此使用单独的函数的好处是,如果发现一种方法比另一种方法更快,则可以更改使用indexof、regexp或substring的实现。
- 这是一个很慢的方法,比较将在整个字符串中继续进行,如果这个方法被大量调用,我不会使用这个方法。
- 请不要修改标准对象。这不是最佳做法。
您也可以使用string.match()和正则表达式:
1
| if(pathname.match(/^\/sub\/1/)) { // you need to escape the slashes |
号
如果找到匹配的子字符串,string.match()将返回一个数组,否则为空。
- 是否有任何方法可以在expr中动态插入URL字符串?例如,在URL中转义/?
- @tjorriemorrie您可以使用regex类来完成这项工作,比如var reurltester=new regex(您的url_字符串);if(reurltester.test(url))//使用test函数来查看url是否匹配。
- @克罗斯,呃,你错了,这个类实际上是"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/…
更具可重用性的功能:
1 2 3
| beginsWith = function(needle, haystack){
return (haystack.substr(0, needle.length) == needle);
} |
首先,让我们扩展字符串对象。多亏了RicardoPeres的原型,我认为在使变量"string"更易读的上下文中,使用变量"string"比使用"needle"效果更好。
1 2 3
| String.prototype.beginsWith = function (string) {
return(this.indexOf(string) === 0);
}; |
然后像这样使用它。小心!使代码非常可读。
1 2 3 4
| var pathname = window.location.pathname;
if (pathname.beginsWith('/sub/1')) {
// Do stuff here
} |
。
- 没有添加任何内容。
- imho indexof搜索整个字符串,如果在开始时找不到立即匹配的字符串,那么它的效率会因搜索的字符串太长而提高。
看看javascript substring()方法。