You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何'Ö'.localeCompare('Z')返回-1,但'Ö' > 'Z'结果为true?

为什么localeCompare和直接字符串比较结果不一致?

这俩的核心差异在于用了完全不同的比较逻辑:

1. 直接比较运算符(>、<等):纯Unicode码点对比

JavaScript里的字符串直接比较,是把每个字符转换成对应的Unicode码点数值来逐一对比,完全不考虑语言文化规则。
比如:

  • 'Z'的Unicode码点是U+005A,对应十进制90
  • 'Ö'的Unicode码点是U+00D6,对应十进制214
    因为214 > 90,所以'Ö' > 'Z'会返回true。

2. localeCompare():遵循本地化语言排序规则

localeCompare()的排序逻辑是基于当前运行环境的语言文化规则,而不是字符的码点值。在大多数默认的本地化设置(比如英语、德语环境)里,Ö会被当作字母O的变体字符,在字典排序中排在Z的前面。按照这个规则,Ö被判定为“小于”Z,所以'Ö'.localeCompare('Z')返回-1。

如果需要让localeCompare()采用类似直接比较的码点排序逻辑,可以通过配置参数调整,比如:

// 强制按字符变体(含码点)排序,此时结果会和直接比较一致
console.log('Ö'.localeCompare('Z', 'und', { sensitivity: 'variant' })); // 返回1

内容的提问来源于stack exchange,提问作者Даниил Дорофеев

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:15:39