在查看与排序相关的一个问题时,我遇到了字符串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其他条件运算符?
为什么不同浏览器对特殊字符的响应不同?
可能是因为正如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”等。 有没有一种简单的方法可以将所有这些字符串替换为实际的字符,或者我必须像下面的例子一样为每个字符手动替换? 手动示例: 编辑: 我正在寻找某种方法来处理字符串,就像这样的转义字符串(尽管我知道这是行不通的)