JavaScript字符串比较依据UTF-16码元值按Unicode码点字典序逐位进行,短串为前缀时更小,不区分语言特性,数值或本地化排序需显式转换或使用localeCompare。

JavaScript 字符串比较依据的是 UTF-16 编码下的字符码元(code unit)值,本质是按每个字符在 Unicode 标准中的码点(code point)顺序,从左到右逐位比对。
基于 Unicode 码点的字典序比较
JavaScript 将字符串视为 UTF-16 编码的序列。比较时并不解析语义或数值含义,而是:
- 从首字符开始,依次取两个字符串在相同位置的字符;
- 获取各自对应的 UTF-16 码元值(对基本多文种平面 BMP 字符,即
charCodeAt(0)返回的值); - 一旦某位置两字符码元不等,立即根据大小关系返回结果;
- 若一个字符串是另一个的前缀(如
"abc"和"abcdef"),则较短者被认为更小。
中文、符号、大小写字母一视同仁
所有字符都按真实 Unicode 码点参与比较,没有语言特例:
-
"大" > "小"→ false(U+5927 = 22823,U+5C0F = 23567); -
"你好" > "你们"→ true(首字相同,第二字“好”U+597D=22909 > “们”U+4EEC=20204); -
"a" > "A"→ true(97 > 65); -
"é" > "e"→ true(U+00E9 = 233 > 101)。
注意:不是按数值,也不是 locale 意义上的“自然排序”
直接使用 >、< 比较含数字的字符串会出人意料:
立即学习“Java免费学习笔记(深入)”;
-
"5" > "10"→ true(先比 '5' 和 '1',53 > 49); -
"\5" > "\10"→ true(转义后是字符 '\x05' 和 '\x01'+'0',实际比的是 U+0005 和 U+0001); - 需要数值比较时,应显式转换:
Number(a) > Number(b)或parseInt(a) > parseInt(b); - 需要语言敏感排序(如中文拼音序、德语变音规则),必须用
str1.localeCompare(str2)。
编码层面的细节补充
JavaScript 内部用 UTF-16 表示字符串,这意味着:
- 大部分常用字符(ASCII、常用汉字)占 2 字节,对应一个码元;
- 超出 BMP 的字符(如 emoji ? 或罕见汉字“?”U+20BB7)由一对代理码元(surrogate pair)表示;
-
charCodeAt()操作的是码元而非完整字符,处理代理对需用Array.from(str)或String.prototype.codePointAt(); - 但标准比较操作(
>等)已正确处理代理对,无需手动干预。


















