我们在JavaScript中的
当涉及到不区分大小写的操作时,我们有一些常用的选项,虽然它们都还远远不够理想。
最常用的技巧是使用
第二个选项是使用带有
es2018中不区分大小写的
我正在寻找一个生产级别(考虑MDN polyfills)的、高效的、i18n友好的代码,它被设计为通用的解决方案。
String
对象中提供了多个本地方法:
String.prototype.startsWith()
String.prototype.endsWith()
String.prototype.includes()
String.prototype.indexOf()
String.prototype.lastIndexOf()
当涉及到不区分大小写的操作时,我们有一些常用的选项,虽然它们都还远远不够理想。
toUpperCase()
和 toLowerCase()
最常用的技巧是使用toUpperCase()
和toLowerCase()
方法。然而,它们并不能正常处理所有语言(德语、土耳其语等),而且把两个字符串都转换为大写或小写的操作会对性能造成影响,尽管通过查看前一对字符的结果就可以知道操作的结果。
正则表达式
第二个选项是使用带有i
选项的正则表达式
。然而,它也有两个主要缺点:
- 不明确和混乱的代码(因为它几乎总是与
正则表达式
一起出现) - 由于组合
正则表达式
字符串并将其编译成实际正则表达式
所造成的性能开销
Intl
和其他更新的API)以及像TypeScript和Babel这样的转换器,以及像core-js
这样的polyfill库来解决任何应用程序中的问题。es2018中不区分大小写的
String
操作的解决方案是什么呢?我正在寻找一个生产级别(考虑MDN polyfills)的、高效的、i18n友好的代码,它被设计为通用的解决方案。
'foObAR'.toLowerCase().startsWith('foo')
,而是使用'foObAR'.slice(0, 3).toLowerCase().startsWith('foo')
。 - CertainPerformanceString.fromCharCode()
遍历16位值,并将.toLowerCase().toUpperCase()
与仅.toUpperCase()
进行比较,其中几个字符未通过测试! - Pointys1,startsWithCaseInsensitive(s2)
呢? - Alexander AbakumovstartsWithCaseInsensitive()
polyfill中进行“切片”的字符数?2. “切片”意味着(a)内存分配和(b)某种内存区域复制的循环(尽管后者可能编译为单个高级CPU指令)。这种优化效益完全取决于字符串的长度,并且可能是通用polyfill的不必要过度复杂化。至少,我从未在MDN polifills中看到过这样的优化目标案例分析。 - Alexander Abakumov