JavaScript 检测不同场景下的八进制值

JavaScript Detecting Octal Value at Different Scenario

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 returns 字符串,不是数字,即使你输入的全是数字。

即使您通过Number(num)+num将字符串转换为数字,运行时字符串->数字转换的规则与解析JavaScript源代码的规则不同.

var x = 02345;

var y = x.toString("8");


alert(y);

这会给你 2345
前导零被解释为八进制值。
如果您需要将数字转换为带前导零的字符串,请使用我的方法,但只需像这样修改即可var y = "0" + x.toString("8")