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

标签 javascript tostring coercion

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/

相关文章:

java - LinkedBinaryTree<E> 类的 toString() 方法

haskell - 强制性和存在主义

java - 如何打印我的 Java 对象而不得到 "SomeType@2f92e0f4"?

javascript - React Native - 良好实践 : SegmentedControlIOS with ListView

javascript - 带滚动的响应式导航 DIV

Javascript 构造函数与 Typescript 类

java - 打印 Java 数组的最简单方法是什么?

javascript - 为什么 JavaScript 在连接时优先转换为字符串,而在比较时优先转换为数字?

GraphQL 类型强制

php - 无法在javascript中取消转义JSON内容