当前位置: 首页 > 知识库问答 >
问题:

JavaScript中特殊字符的localCompare和comparison运算符的不同结果

司徒耀
2023-03-14

在查看与排序相关的一个问题时,我遇到了字符串localeCompare方法和条件运算符(如)之间的非字母数字字符比较的有趣差异

通过在不同的浏览器中运行下面的代码段,您可以看到它们之间的差异。

function comparison1(param1, param2){
  return param1 > param2;
}

function comparison2(param1, param2){
  return param1.localeCompare(param2);
}
document.getElementById("comparison11").innerHTML = comparison1('A', 'B');
document.getElementById("comparison12").innerHTML = comparison2('A', 'B');
document.getElementById("comparison21").innerHTML = comparison1('@', '_');
document.getElementById("comparison22").innerHTML = comparison2('@', '_');
<div>
  <div style="float: left, width: 100%">
    'A' > 'B'
  </div>
  <div style="float: left, width: 100%" id="comparison11"></div>
  <div style="float: left, width: 100%">
    'A'.localeCompare('B')
  </div>
  <div style="float: left, width: 100%" id="comparison12"></div>
  <div style="float: left, width: 100%">
    '@' > '_'
  </div>
  <div style="float: left, width: 100%" id="comparison21"></div>
  <div style="float: left, width: 100%">
    '@'.localeCompare('_')<br/>
    <i>returns -1 in IE and Edge but 1 in Chrome and Firefox</i>
  </div>
  <div style="float: left, width: 100%" id="comparison22"></div>

</div>
<script>
</script>

如您所见,在使用localeCompare方法和

我们实现了用于排序的比较方法,该方法针对具有不同数据类型的多个列进行调用。所以我们使用了条件运算符,但正如您所看到的,它为不同浏览器中的非字母数字字符提供了不同的结果。

这里是我的问题!

为什么不同浏览器对特殊字符的响应不同?

什么是正确的实现方式?检查数据类型;如果字符串使用localeCompare其他条件运算符?


共有1个答案

逑沛
2023-03-14

为什么不同浏览器对特殊字符的响应不同?

可能是因为正如ECMA-402(国际化)规范中所述:

Unicode的子集:某些操作(如排序规则)对可以包括整个Unicode字符集中的字符的字符串进行操作。但是,Unicode标准和ECMAScript标准都允许实现将其功能限制为Unicode字符集的子集。此外,区域设置约定通常不会为整个Unicode字符集指定所需的行为,而只针对与区域设置相关的字符。虽然Unicode归类算法结合了整个Unicode字符集的默认归类顺序和根据本地约定定制的能力,但子集和定制仍然会导致行为差异。

最有可能的是,@\的顺序在您使用的地区(或我的地区;英国英语)中没有明显的定义,因此您会得到“行为上的差异”

正确的方法是什么?(检查数据类型;如果字符串使用localeCompare else条件运算符?)

是的。<代码>

明确一点:当你说你...使用条件运算符时,我假设你指的是条件运算符(?:)和关系运算符()的组合

return a === b ? 0 : a > b ? 1 : -1;

...或类似于排序回调。

但是请注意,由于您现在正在对字符串使用localeCompare,而且您唯一可以真正有意义地与

return a - b; // For numbers that aren't NaN

(如果其中一个可能是NaN,则您需要处理该问题

 类似资料:
  • 本文向大家介绍JavaScript中一些特殊的字符运算,包括了JavaScript中一些特殊的字符运算的使用技巧和注意事项,需要的朋友参考一下 1.什么是 --> ?     这两个分开是很简单的两个运算符,比如--,一般表示自减,var i = 5;while(i){console.log(i--);},会打印出5,4,3,2,1;    那么这两个结合起来呢?   在c中 -->表示的是趋向于

  • 本文向大家介绍SQL中的特殊运算符,包括了SQL中的特殊运算符的使用技巧和注意事项,需要的朋友参考一下 SQL中不同的特殊运算符如下- 所有运算符 任何运算符 运算符之间 EXISTS运算符 IN运算符 LIKE运算符 现在让我们创建一个表来了解特殊运算符的示例- <员工> Emp_ID Emp_Name Emp_Salary Emp_DeptID Emp_DeptName 1 亚伦 10000

  • 问题内容: 我正在为法国客户做一些工作,因此需要处理带重音符号的字符。但是我遇到了很多困难,希望解决方案很简单,并且有人可以向我指出。 字符串: 转换为: 请注意,带重音符号的字符缺失- 在 ê* 后面紧跟着 t ,在 é 后面紧跟着 m 。 * 我尝试使用StringEscapeUtils来成功转义某些字符,例如 ă 。我还构建了自己的转义功能,该功能产生相同的结果( ă 可以工作, ê 不会)

  • 9.2 宏参数的特殊运算符 为了宏定义和引用的某些特殊需要,汇编程序还支持几个具体特定含义的运算符。 9.2.1 连接运算符 在宏定义中,如果形式参数与其它字符连接在一起,或形式参数出现在字符串之中,那么,就必须使用连接运算符(&)。 例9.5 定义一个转移宏JUMP,其一个参数决定转移类别,另一个参数指定转移目标。 解: JUMP MACRO CON, here J&CON here ENDM

  • 我想检查一个字符串是否包含特殊字符,比如!@#$%^&*.,<>/\'“;:?如果字符串至少包含其中一个字符,则返回true。 我尝试使用以下regex脚本:

  • 我有一个从xml文档中读取数据的程序。在这个xml文档中,一些属性包含特殊字符,如“\n”、“t”等。 有没有一种简单的方法可以将所有这些字符串替换为实际的字符,或者我必须像下面的例子一样为每个字符手动替换? 手动示例: 编辑: 我正在寻找某种方法来处理字符串,就像这样的转义字符串(尽管我知道这是行不通的)