在JavaScript中使用toLowerCase或toUpperCase比较字符串会更好吗?

时间:2014-11-12 01:06:49

标签: javascript internationalization string-comparison

我正在进行代码审核,如果在尝试比较它们时忽略大小写,请将JavaScript中的字符串转换为大写或小写更好。我很高兴。

琐碎的例子:

var firstString = "I might be A different CASE";
var secondString = "i might be a different case";
var areStringsEqual = firstString.toLowerCase() === secondString.toLowerCase();

或者我应该这样做:

var firstString = "I might be A different CASE";
var secondString = "i might be a different case";
var areStringsEqual = firstString.toUpperCase() === secondString.toUpperCase();

似乎"应该"或者只使用有限的字符集,只有英文字母,所以它比另一个更健壮吗?

作为一个注释,MSDN建议将字符串规范化为大写,但这适用于托管代码(可能是C#和F#,但它们有奇特的StringComparers和基础库):http://msdn.microsoft.com/en-us/library/bb386042.aspx

2 个答案:

答案 0 :(得分:18)

修订答案

我回答这个问题时已经有一段时间了。虽然文化问题仍然存在(而且我认为它们不会消失),ECMA-402标准的发展使我原来的答案......过时(或过时了?)。

比较本地化字符串的最佳解决方案似乎是使用函数localeCompare()和适当的语言环境和选项:

var locale = 'en'; // that should be somehow detected and passed on to JS
var firstString = "I might be A different CASE";
var secondString = "i might be a different case";
if (firstString.localeCompare(secondString, locale, {sensitivity: 'accent'}) === 0) {
    // do something when equal
}

这将比较两个字符串不区分大小写但对重音敏感(例如ą != a).
If this is not sufficient for performance reasons, you may want to use either
toLocaleUpperCase()or toLocaleLowerCase()`将语言环境作为参数传递:

if (firstString.toLocaleUpperCase(locale) === secondString.toLocaleUpperCase(locale)) {
    // do something when equal
}

理论上应该没有差异。在实践中,细微的实现细节(或在给定的浏览器中缺乏实现)可能会产生不同的结果......

原始答案

我不确定你是否真的想在Internationalization(i18n)标签中提出这个问题,但是因为你做了...... 可能最意想不到的答案是:既不

tons of problems有大小写转换,如果你想转换字符大小写而不指示语言(如在JavaScript情况下),则不可避免地会导致功能问题。例如:

  1. 有许多自然语言没有大写和小写字符的概念。尝试转换它们没有意义(虽然这样可行)。
  2. 有转换字符串的语言特定规则。德语sharp S字符(ß)必然会被转换为两个大写字母S(SS)。
  3. 土耳其语和阿塞拜疆语(或者阿塞拜疆语,如果你愿意的话)有“非常奇怪”concept of two i characters:无点ı(转换为大写I)和点缀i(转换为大写İ< - 此字体不允许为了正确的呈现,但这是真正不同的字形)。
  4. 希腊语有许多“奇怪的”转换规则。一个特殊的规则是大写字母sigma(Σ),它取决于单词中的一个地方有两个小写的对应物:常规西格玛(σ)和最终西格玛(ς)。关于“重音”字符还有其他转换规则,但在转换功能的实现过程中通常会省略它们。
  5. 某些语言has title-case letters,即Lj应该转换为LJ或更不合适的LJ。同样可以考虑ligatures
  6. 最后有许多compatibility characters可能与您要比较的内容相同,但由完全不同的字符组成。更糟糕的是,像“ae”这样的东西可能相当于德语和芬兰语中的“ä”,但相当于丹麦语中的“æ”。
  7. 我试图说服你,从字面上比较用户输入,而不是转换它真的更好。如果它与用户无关,则可能无关紧要,但案例转换总是需要时间。为什么要这么麻烦?

答案 1 :(得分:0)

它永远不会依赖于浏览器,因为它只涉及到javascript。 两者都会根据需要改变的字符数来表示性能(翻转情况)

var areStringsEqual = firstString.toLowerCase() === secondString.toLowerCase();
var areStringsEqual = firstString.toUpperCase() === secondString.toUpperCase();

如果您使用@adeneo准备的测试,您可以感觉它与浏览器有关,但是可以进行一些其他测试输入,例如“AAAAAAAAAAAAAAAAAAAAAAAAAAAA”& “aaaaaaaaaaaaaaaaaaaaaaaaaaaaa”并进行比较。

Javascript性能取决于浏览器是否存在某些dom api或任何dom操作/交互,否则对于所有普通的javascript它将提供相同的性能。