toLowerCase() 和 toUpperCase() 基于 Unicode 简单映射,不考虑 locale;toLocaleLowerCase() 和 toLocaleUpperCase() 支持语言环境,如土耳其语的 İ/i、德语的 ß→SS。

JavaScript 中 toLowerCase() 和 toUpperCase() 的行为看似简单,但实际受 Unicode 版本、语言环境(locale)和字符特性影响,并非简单的“英文字母大小写翻转”。规范核心在于:它们基于 Unicode 字符数据库的大小写映射规则,且默认使用“语言中立”的基本映射(case mapping),不考虑特定语言的本地化规则。
基础行为:基于 Unicode 标准的无 locale 映射
这两个方法在没有显式指定 locale 时,遵循 Unicode 标准中的 simple case mapping(简单大小写映射),而非 full case mapping(完整映射)。这意味着:
- 只处理有明确定义大小写关系的 Unicode 字符(如拉丁字母、希腊字母、西里尔字母等);
- 对没有大小写概念的字符(如数字、标点、汉字、大部分 emoji)原样返回;
- 不处理某些语言特有的大小写规则(例如土耳其语的 dotted/dotless i、德语 ß 在 toUpperCase 中不转为 SS);
- 不保证可逆性:例如
"ß".toUpperCase() === "SS"为 false(实际返回"ß"),因为toUpperCase()默认不执行上下文相关的完整转换。
locale-aware 版本:toLocaleLowerCase() 与 toLocaleUpperCase()
当需要符合特定语言习惯时,应使用带 locale 参数的版本:
-
"İ".toLocaleLowerCase("tr")→"i"(带点大写 I 在土耳其语中转为带点小写 i); -
"i".toLocaleUpperCase("tr")→"İ"(普通小写 i 在土耳其语中转为带点大写 I); -
"ß".toLocaleUpperCase("de")→"SS"(德语环境下,ß 正确转为 SS); - 若未传 locale,
toLocaleXXX会使用运行时默认 locale,结果可能因环境而异,不推荐省略。
常见陷阱与注意事项
开发中容易忽略的关键细节:
立即学习“Java免费学习笔记(深入)”;
- 非 ASCII 字符支持依赖引擎实现:早期浏览器对 Unicode 3.2+ 新增字符(如某些数学符号、表情符号变体)支持不一致,现代引擎(V8、SpiderMonkey、JavaScriptCore)已基本覆盖 Unicode 15+;
-
空字符串或 null/undefined 调用会报错:必须确保调用对象是字符串类型,建议先做类型检查或使用
String(value).toLowerCase(); - 不修改原字符串:两个方法都返回新字符串,原字符串保持不变(字符串在 JS 中不可变);
-
正则匹配前统一大小写需谨慎:若用于 case-insensitive 比较,推荐用
String.prototype.localeCompare()配合sensitivity: "base",比手动 toLowerCase 更可靠(尤其涉及多语言文本时)。
实际建议
日常开发中可按场景选择:
- 处理纯英文标识符(如变量名、URL path)、ASCII 子集数据 → 直接用
toLowerCase()/toUpperCase()安全高效; - 用户界面文本、多语言输入、表单验证 → 优先使用
toLocaleLowerCase(locale),并明确传入用户语言(如navigator.language或服务端下发); - 需要严格大小写无关比较 → 使用
localeCompare或正则的i标志,避免依赖字符串归一化; - 构建国际化工具函数时,应封装 locale 参数,默认 fallback 到
en-US或系统 locale,而非留空。


















