[英]Case-insensitive string operations in es2018
JavaScript 中的String
object 提供了多種本地方法:
String.prototype.startsWith()
String.prototype.endsWith()
String.prototype.includes()
String.prototype.indexOf()
String.prototype.lastIndexOf()
它們都區分大小寫。
當談到不區分大小寫的操作時,我們有一些流行的選項,盡管它們都遠非理想。
toUpperCase()
\ toLowerCase()
最流行的技巧是使用toUpperCase()
\ toLowerCase()
方法。 但是,它們不適用於所有語言(德語、土耳其語等),並且即使通過查看第一對字符就可以知道操作的結果,但轉換兩個字符串的性能也會受到影響。
RegEx
第二個選項是使用帶有i
選項的RegEx
es。 但是,它也有兩個主要缺點:
RegEx
es 幾乎總是這樣)RegEx
字符串並將其編譯為每個操作的實際RegEx
導致的性能開銷此外,這些解決方案是在古代 JavaScript VM 時代“發明”的。 現在有了Intl
(和其他更新的)API 和 TypeScript 和 Babel 等轉譯器以及core-js
等 polyfill 庫,我們可以輕松地為任何應用程序 API 使用最新的 Z686155AF75A60A0F6E9D80C1F7。
es2018中不區分大小寫的String
操作有什么解決辦法?
我正在尋找生產(想想 MDN polyfills)質量性能 i18n 友好的代碼,該代碼旨在成為解決問題的通用首選解決方案。
以下是不區分大小寫的startsWith
的一些實現
不將整個字符串轉換為小寫,而是僅使用測試字符串的長度:
function startsWith_Insensitive(str, test) {
return str.substr(0, test.length).toLowerCase() === test.toLowerCase();
}
而且我認為一個一個地轉換和測試字符也會更有效,如果有任何不同就停止,而不是全部轉換然后測試它們,所以看起來像這樣:
function startsWith_Insensitive(str, test) {
if (str.length < test.length) return false;
for (let i = 0; i < test.length; i++) {
if (str[i].toLowerCase() !== test[i].toLowerCase())
return false
}
return true
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.