JavaScript 中特殊字符的 localCompare 和比较运算符之间的不同结果

2023-12-06

在研究与排序相关的一个问题时,我发现了字符串之间的非字母数字字符比较的有趣差异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方法和>Chrome 和 Firefox 中的运算符。

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

这是我的问题!

Why不同浏览器对特殊字符的响应不同?

What是正确的方法来实现这个吗? (检查数据类型;如果字符串使用 localeCompare else 条件运算符?)


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

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

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

最有可能的顺序是@ vs. _只是在您使用的区域设置(或我的;英国英语)中没有明确定义,所以您得到“行为上的差异。”

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

Yes. > and <使用 Unicode 标准中代码点的数字关系,这根本不是处理排序规则的好方法,而localeCompare为字符提供特定于区域设置的排序规则。

需要明确的是:当你说你“...使用条件运算符”,我假设你的意思是条件运算符(? :) 与关系运算符 (> or <在这种情况下),例如就像是:

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

...或类似的sort打回来。

但请注意,由于您现在正在使用localeCompare对于字符串,唯一可以真正有意义地比较的东西> and <是数字,对于数字有更好的解决方案if你知道他们都不是NaN:只需减去:

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

(如果其中任何一个可能是NaN,您可能需要使用条件运算符来处理它。 :-) )

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 中特殊字符的 localCompare 和比较运算符之间的不同结果 的相关文章

随机推荐

  • 使用 makecert 进行开发 SSL

    这是我的情况 我正在尝试创建一个 SSL 证书 该证书将安装在所有开发人员的计算机上 以及两个内部服务器 一切都是非生产的 我需要做什么来创建一个可以安装在所有这些地方的证书 现在 我使用 Microsoft Visual Studio 8
  • 使用 Jersey 在正文请求中 POST JSON

    我有一个 Java 动态 Web 项目 部署在本地应用程序服务器 Tomcat 7 上 它使用 Jersey 来创建 REST API 我不使用任何构建自动化工具 因此我的库被添加到构建路径中 并且 servlet 被插入到 web xml
  • 使用 Plotly 与 Slider 进行交互式绘图

    如何使用 Plotly 在 Python 中重新创建以下交互式绘图 我的简单示例绘制了一个条形图 其中一列为 x 另一列为 1 x 来自 Mathematica 的 GIF 滑块允许 x 在 0 到 1 之间变化 数学代码 Manipula
  • 如何在嵌套 JSON 值上使用 SwiftyJSON

    我正在调用一个 JSON API 它有几个我需要获取的嵌套值 我使用 SwiftyJSON 来让事情变得更干净一些 对于顶级值 一切似乎都工作正常 但在更深层次的情况下 我得到了可怕的 展开可选值时为零 以下是我使用 Alamofire 进
  • 如何仅解决 chrome - ERR_HTTP2_PROTOCOL_ERROR - 加载图像问题。 ? (2022)

    这种情况仅在最近几天 2022 年 1 月 开始发生 并且仅在 Chrome 中发生 例如 97 0 4692 99 官方版本 64 位 如果我的页面上有 10 多个图像 chrome 会随机无法下载一些图像 原因如下 失败 net ERR
  • 同一页面中的两个jquery分页插件似乎不起作用

    我使用 jquery 分页插件进行分页 如果有一个分页插件对我来说没有问题 但是如果有两个 一个似乎可以工作 但另一个似乎不起作用 这是我的代码 div class pager div br br br div div div class
  • 如何按日期对图库缩略图图像进行排序

    我正在开发一个安卓应用程序 该应用程序从图库中获取所有缩略图 我想按日期对这些缩略图进行排序 但我做不到 请帮我 获取所有图像 Set up an array of the Thumbnail Image ID column we want
  • Web Deploy 3.0 发布时出现令人恼火的 401 错误

    我似乎无法将简单的应用程序部署到我作为管理员的 IIS 服务器 这是我从 VS2010 收到的错误消息 修改域名以保护无辜者 Build started Project HelloWorldWeb Configuration Debug A
  • 保存 WPF 应用程序页面的状态

    我正在 WPF 中创建一个软件 在该软件中 用户可以加载图像并配置地图 基本上 一旦加载 地图的 图像 用户就可以添加其他图像 如宝藏或怪物的图片等 将它们拖放到地图的图像中 当用户关闭软件并重新打开它时 我希望最后打开的图像和添加的 UI
  • 如何在 laravel 中创建从 public/storage 到 storage/app/public 的符号链接?

    我不知道如何创建符号链接 or symlink 我正在 Laravel 5 2 中的文件系统上工作 该文件说我需要创建一个符号链接 from 公共 存储 to 存储 应用 公共将可公开访问的文件保存在一个目录中 如何创建符号链接或符号链接
  • 使用 FFmpeg 时删除连续重复的帧

    有没有什么方法可以使用来检测视频中的重复帧ffmpeg I tried vf标志与select gt scene 0 xxx 用于场景变换 但是 它对我的 情况不起作用 Use the mp抽取过滤器 其目的是 丢弃与前一帧差异不大的帧 以
  • 抑制 Firebase 错误登录失败的signInWithEmailAndPassword

    我正在尝试在 NextJS 中使用 Firebase 身份验证来实现登录功能 尽管登录函数的处理程序中的 catch 语句为空 但使用无效登录详细信息调用该函数会向控制台记录错误 如何禁止 Firebase 将此错误记录到控制台 登录函数处
  • 如何使用多线程发送 MailMessages?

    我希望你们能容忍我在线程方面完全缺乏方向 我必须实现一个邮件队列处理系统 我必须通过 Windows 服务发送在数据库中排队的电子邮件 它不是生产者 消费者模式 我一次将 10 行提取到数据表中 数据表包含序列化的 MailMessage
  • 如何在 Angular 中对卡片进行分页?

    我正在尝试制作剧集指南 每一集都显示在卡片上 共有 25 张卡片 每页显示 6 张 我有可用的 下一个 和 上一个 按钮 但需要通过分页系统对此进行改进 该系统每个屏幕显示 6 张卡片 并且您可以使用上一个 1 2 3 等进行导航 这是我到
  • 使用 swing GUI 在下载文件时显示进度条[重复]

    这个问题在这里已经有答案了 我目前有一堂课应该在下载文件时向我显示一个简单的表单 它正在工作 但进度条没有更新 只有下载完成后我才能看到它 有人能帮我吗 import java awt FlowLayout import java io i
  • Jar 在主机上运行但在 docker 容器中失败

    我有一个jar在我的主机上运行良好 具体来说 当我跑步时 java jar myjar jar 我得到预期的输出 2018 12 05 16 46 53 917 boot 21252 INFO main 应用程序 没有活动配置文件集 回退到
  • PostgreSQL触发器动态生成多个表的代码

    我想为数据库中的许多表生成代码 当我准备好编写 获取表 X 的代码 的第三个实现时 我停止重构我的解决方案 我的代码是这样的 Tenants receive a code that s composed of a portion of th
  • 如何使用 FTDI D2XX 驱动程序 API 获取 Linux 设备

    我在用FTDI D2XX驱动程序 API 与 FTDI 设备进行通信 它为我提供了有关设备的一些信息 例如位置 序列号 描述 但这还不够 我如何获取设备编号 dev ttyUSBXX 或使用此 API 的总线或端口 thanks As th
  • UI 与 ObservableCollection 不同

    我试图让 ListView 更改为我在 ObvservableCollection 中修改的任何值 我目前正在使用它并将 Collection 绑定到我的 ListView private ObservableCollection
  • JavaScript 中特殊字符的 localCompare 和比较运算符之间的不同结果

    在研究与排序相关的一个问题时 我发现了字符串之间的非字母数字字符比较的有趣差异localeCompare方法和条件运算符 例如 gt lt 您可以通过在不同浏览器中运行以下代码片段来看到它们之间的差异 function comparison