Javascript的map函数将值转换为十进制

10

我有一个这样的数组。

var elements=[5614,6619,7220,7320,7830,8220,0111,0112,0113,0142,0149]

我将每个元素转换为字符串,以便与 jQuery 自动完成一起使用。我使用 .map 函数来完成这个过程。

elements = elements.map(String);

输出结果为

["5614", "6619", "7220", "7320", "7830", "8220", "73", "74", "75", "98", "149"]

该函数将0111、0112、0113、0142这些值作为八进制值并将其转换为十进制

我不想更改这种行为并且想要保留前导零,应该怎么做?请帮忙。


number类型变量上无法保留前导零。 - CertainPerformance
这不是由于字符串转换引起的,而是因为您在定义数字值时使用了前导零。 - Rory McCrossan
1
因为正如你所指出的,像 0111 这样写的数字是八进制表示法,如果你的输入数据是一个数字 0111,那么你将很难将其“转换”为字符串 "0111"... 因为你已经声明了一个像var elements=` 这样的数组,我建议你编辑代码以删除前导零。 - Jaromanda X
elements.map(c=>c.toString(10)) - greentec
2
@greentec 已经做了与 OP 相同的事情。 - VLAZ
显示剩余2条评论
1个回答

12

该函数将0111、0112、0113、0142等值视为八进制值并将其转换为十进制值。

实际上,不是该函数在执行此操作,而是以下代码:

var elements=[5614,6619,7220,7320,7830,8220,0111,0112,0113,0142,0149]

在松散模式下,如果你以一个0开始,后面跟着一系列八进制数字,那么它就是八进制的。这就是为什么010 === 8是真的:

console.log(010 === 8); // true

如果你在数字前面加上一个0,后面跟着一个非八进制数字(89),那么这个数字就是十进制的,所以011 === 099 === 09都是正确的:

console.log(011 === 09); // true
console.log(9 === 09);   // true

解决方案是:
  1. 使用严格模式("use strict";)。在严格模式下,旧的八进制字面量(010)和旧的非八进制小数字面量(08)都被禁止使用。(如果需要编写八进制数,可以使用新的0o10格式 —— 这是数字8。)

  2. 不要在数字前面加上前导零(可能例外的情况是在小于1的分数数字中,小数点前面刚好有一个0)

你无法事后修复elements(因为一旦它们成为数字,就无法知道哪些是错误地以八进制写入的),必须在创建它的时候进行修复,例如:

var elements=[5614,6619,7220,7320,7830,220,111,112,113,142,149]

3
哇,真是一次受教育。 - Mitya
感谢 T.J. Crowder。 - Jayababu

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