javascript - mdn - startswith python
如何檢查一個字符串“StartsWith”是否是另一個字符串? (12)
.lastIndexOf
另一種替代.lastIndexOf
:
haystack.lastIndexOf(needle, 0) === 0
這從haystack
的索引0
開始,通過haystack
向後看起來是needle
的發生。 換句話說,它只檢查haystack
是否以needle
開始。
原則上,這應該比其他方法具有性能優勢:
- 它不搜索整個
haystack
。 - 它不會創建新的臨時字符串,然後立即丟棄它。
我如何在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 : http://jsperf.com/startswith2/6 。 我添加了一個微小的性能改進,此後還添加了一個比較字符串為空或未定義的檢查,並使用CMS的答案中的技術將其轉換為添加到String原型。
請注意,此實現不支持在此Mozilla開發者網絡頁面中提到的“position”參數,但它似乎不是ECMAScript提案的一部分。
您也可以通過創建您自己的原型/擴展到數組原型,也可以返回以字符串開頭的數組的所有成員
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
您可以使用ECMAScript 6的.startsWith方法,但它尚未在所有瀏覽器中受支持 。 您需要使用填充/填充將其添加到不支持它的瀏覽器上。 創建符合規範中規定的所有細節的實現有點複雜,並且此答案中定義的版本不會執行; 如果你想要一個忠實的墊片,使用:
- Matthias Bynens的
String.prototype.startsWith
墊片或 - es6-shim盡可能多地增加了ES6規格,包括
String.prototype.startsWith
。
一旦你完成了這個方法(或者你只支持已經有的瀏覽器和JavaScript引擎),你可以像這樣使用它:
"Hello World!".startsWith("He"); // true
var haystack = "Hello world";
var prefix = 'orl';
haystack.startsWith(prefix); // false
我只是想補充一下我的看法。
我想我們可以像這樣使用:
var haystack = 'hello world';
var needle = 'he';
if (haystack.indexOf(needle) == 0) {
// Code if string starts with this substring
}
我在尋找性能,所以我通過jsperf運行了這些功能。 我測試了不同大小的主題和搜索字符串的功能,並且似乎所有方法都表現出不同輸入的不同性能; 一般模式是性能隨著搜索字符串長度的增加而降低。
總體的勝利者原來是這樣的子方法。
最佳方案:
function startsWith(str, word) {
return str.lastIndexOf(word, 0) === 0;
}
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
如果你也需要這個,
function endsWith(str, word) {
return str.indexOf(word, str.length - word.length) !== -1;
}
對於那些喜歡將其原型化為String的人:
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
最好的高性能解決方案是停止使用庫調用,並只是認識到你正在使用兩個數組。 手執的實現既短又快,比我在這裡看到的其他所有解決方案都快。
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 。 (請確保您檢查可能違背我的更高版本。)
由於這個過程非常流行,我認為值得指出的是,ECMA 6中有一種實現這種方法的方法,並且為了防止將來出現問題和眼淚,為了準備那個人應該使用'官方'polyfill。
幸運的是,Mozilla的專家為我們提供了一個:
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
if (!String.prototype.startsWith) {
String.prototype.startsWith = function(searchString, position) {
position = position || 0;
return this.indexOf(searchString, position) === position;
};
}
請注意,這具有在過渡到ECMA 6時優雅地忽略的優點。
這是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
檢查功能是否已經存在,以防將來的瀏覽器以本地代碼實現它,或者是否由另一個庫實現。 例如,Prototype庫已經實現了這個功能。
使用!
雖然不如可讀性,但它比=== 0
稍快且更簡潔。
data.substring(0, input.length) === input
var str = 'hol';
var data = 'hola mundo';
if (data.length >= str.length && data.substring(0, str.length) == str)
return true;
else
return false;