var x = 02345;
var y = x.toString();
alert(y);
我意识到在 JavaScript 中使用 toString() 方法将前导零数字转换为字符串时存在问题。
正如您从上面代码的输出中看到的,输出是 1253
而不是应该的 02345
。
如果删除前导零,代码将按预期工作,为什么?上面的代码发生了什么,所以我可以将其更改为按预期工作。
var x = 2345;
var y = x.toString();
alert(y);
编辑:我问这个问题的原因是因为我有两个不同的代码,尽管非常相似,但它们的工作方式不同。读到这个问题与 toString() 方法无关后,为什么下面的第一组代码没有将数字检测为八进制值,而第二组代码却检测到了。
var num=window.prompt(); // num = 0012222
var str = num.toString();
var result = [str[0]];
for(var x=1; x<str.length; x++)
{
if((str[x-1]%2 === 0)&&(str[x]%2 === 0))
{
result.push('-', str[x]);
}
else
{
result.push(str[x]);
}
}
alert(result.join('')); //Outputs : 0-012-2-2-2
其他代码:
function numberDash(num) {
var stringNumber = num.toString();
var output = [stringNumber[0]];
for (var i = 1; i < stringNumber.length; i++) {
if (stringNumber[i-1] % 2 === 0 && stringNumber[i] % 2 === 0) {
output.push('-', stringNumber[i]);
} else {
output.push(stringNumber[i]);
}
}
return output.join('');
}
numberDash(0012222) // Outputs : "52-6-6";
最佳答案
许多 JavaScript 引擎在规范中添加了八进制数字文字。前导零表示八进制(基数 8)。 2345
以 8 为基数(八进制)是 1253
以 10 为基数(十进制):
Octal Decimal ----- -------------------- 2 2 * 8 * 8 * 8 = 1024 3 3 * 8 * 8 = 192 4 4 * 8 = 32 5 5 ----- -------------------- 2345 1253
您可以使用严格模式禁用它。参见 §B.1.1的规范。这样做会使 02345
成为语法错误。
所以这与toString
无关,只是您代码中的02345
不是您期望的值。
关于您更新的问题:
why does the first set of code below not detect the number as an octal value but the second set of code does
因为在第一段代码中,您处理的不是数字,而是字符串。 window.prompt
返回一个字符串,而不是一个数字,即使您输入的全是数字也是如此。
即使您通过Number(num)
或+num
将字符串转换为数字,运行时string->number 转换的规则与解析 JavaScript 源代码。
关于JavaScript 检测不同场景下的八进制值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30932681/