.toString(16)始终返回小写字母吗?

20
当使用.toString(base)将十进制数转换为一个大于10的进制时,似乎我总是得到一个小写的字符串。我可以依赖这个结果吗? 尽管对于我的应用程序来说需要进行转换,但大写字符串才是正确的。
额外加分项是引用定义此行为规范的部分(我查了一下没找到),以及任何反例(返回大写字符串的浏览器)。
示例:
(12648430).toString(16) // returns: "c0ffee". Not "C0FFEE"

3
你可以依赖这个,但我认为你不应该。如果这个案子真的很重要,只需在适当的地方添加 toLowerCase 并停止担心它。 - georg
如果没有必要,向所有客户发送部署了此代码的更新将是一种遗憾。由于现有浏览器兼容,并且未来浏览器必须兼容,因此我将保留旧代码不变。 - ColBeseder
由你决定,但如果有一天你的代码出了问题,而你唯一的借口是“某个 Stack Overflow 上的人告诉我我的代码没问题” - 那将是一种耻辱! - georg
2个回答

22
是的,它始终为小写字母。自2009年第五版规范以来,已经定义了这一点。以下是5.1规范中的内容;5.0没有直接的链接,但它说的大致相同:
如果ToInteger(基数)不是介于2和36之间的整数,包括2和36,则抛出RangeError异常。如果ToInteger(基数)是从2到36的整数,但不是10,则结果是使用指定基数的此Number值的字符串表示形式。字母a-z用于具有10至35值的数字。如果基数不是10,则精确算法取决于实现,但该算法应是指定在9.8.1中的概括。

current spec 继续指定使用小写字母a-z

之前,1999年的第三版规范(没有第四版)并没有这样说:

如果基数是从2到36的整数,但不是10,则结果是一个字符串,其选择取决于实现方式。

...但是现在,当第三版规范成为当前规范时创建的浏览器已经完全消失了,您可以依靠它的小写形式。实际上,即使在2013年首次发布此答案时,您也可以依赖它,因为如果已知有重大的不同实现,他们通常不会将这种东西添加到规范中。

只是为了好玩,这里有一个快速检查:

const str = (12648430).toString(16);
console.log(`${str} === c0ffee? ${str === "c0ffee"}`);


你说服了我!我不会使用.toLowerCase()。我也会在某个时候测试IE5并发布更新。 - ColBeseder
3
@ColBeseder: :-) FWIW,我同意thg435的观点。我不会仅为此推送更新,但我很想在下一个更新中包含它。然而,如果您有一个强大的测试套件,就没有必要这样做--如果您添加对某些不正确处理此问题的模糊引擎的支持(根据第5版规范),测试套件将检测到该问题。 - T.J. Crowder

1

(12648430).toString(16)始终返回:"c0ffee"。而不是"C0FFEE",在检查了一些浏览器后,我找到了确认:

Number对象覆盖了Object对象的toString()方法;它没有继承Object.prototype.toString()。对于Number对象,toString()方法返回指定基数下对象的字符串表示形式。

toString()方法解析其第一个参数,并尝试以指定基数(底数)返回字符串表示形式。对于大于10的基数,字母表中的字母表示大于9的数字。例如,对于十六进制数(基数为16),使用a到f。

"对于十六进制数(基数为16),使用a到f"。

参考文献:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString


1
这不是对我的回答的重复吗?但是它是指一个非权威的来源,而不是权威的来源(规范)吗? - T.J. Crowder
1
我只是引用了参考文献。 - jacouh
@T.J. Crowder,抱歉,您的断言不具备权威性。在我看来,Javascript是由Netscape发明的,Mozilla是一个很好的参考。 - jacouh
1
@ jacouh:也许我应该说“权威性的”。没错,JavaScript 是由 Netscape 创建的,而且语言的开发仍由 Brendan Eich 领导,Brendan 在 Mozilla 工作。然而,MDN 是一个协作编辑的平台,虽然总体上非常好,但有些内容确实存在问题(例如 forEach 的“shim”,很长一段时间都是错误的)。权威的故事是 ECMA 的官方规范(由 Brendan 领导开发)。但主要观点是,简单地复制以前的答案是没有用的。 - T.J. Crowder
1
我没有看到你的回答,因为我在Mozilla上进行了搜索。你很棒,但我的答案是独立的。 - jacouh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接